From 55401f2adbf9917de75d8bc98fd8775db31b3c9a Mon Sep 17 00:00:00 2001 From: rsc Date: Thu, 30 Aug 2007 14:09:14 +0000 Subject: [PATCH] final xv6 for 2007 --- xv6.pdf | Bin 132933 -> 143013 bytes xv6.ps | 37852 +++++++++++++++++++++++++++++------------------------- 2 files changed, 20197 insertions(+), 17655 deletions(-) diff --git a/xv6.pdf b/xv6.pdf index 0ff81d8715019f32dd83575d34d40134dd824b18..d6defdb9752e8d8692f2c8128f2d7fd7d0b285d6 100644 GIT binary patch literal 143013 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
~rwpz-qLrH-;P3J!0bcyRv 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 z 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 literal 132933 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 diff --git a/xv6.ps b/xv6.ps index 8a7a9db..b73ae3e 100644 --- a/xv6.ps +++ b/xv6.ps @@ -1,16 +1,16 @@ %!PS-Adobe-3.0 -%%Creator: xpdf/pdftops 3.00 +%%Creator: xpdf/pdftops 3.01 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%DocumentMedia: plain 612 792 0 () () %%BoundingBox: 0 0 612 792 -%%Pages: 75 +%%Pages: 79 %%EndComments %%BeginDefaults %%PageMedia: plain %%EndDefaults %%BeginProlog -%%BeginResource: procset xpdf 3.00 0 +%%BeginResource: procset xpdf 3.01 0 /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def @@ -29,8 +29,14 @@ } 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 @@ -43,86 +49,37 @@ /pdfTextClipPath [] def } def /pdfEndPage { end } def -% separation convention operators -/findcmykcustomcolor where { - pop -}{ - /findcmykcustomcolor { 5 array astore } def -} ifelse -/setcustomcolor where { - pop -}{ - /setcustomcolor { - exch - [ exch /Separation exch dup 4 get exch /DeviceCMYK exch - 0 4 getinterval cvx - [ exch /dup load exch { mul exch dup } /forall load - /pop load dup ] cvx - ] setcolorspace setcolor - } def -} ifelse -/customcolorimage where { - pop -}{ - /customcolorimage { - gsave - [ exch /Separation exch dup 4 get exch /DeviceCMYK exch - 0 4 getinterval - [ exch /dup load exch { mul exch dup } /forall load - /pop load dup ] cvx - ] setcolorspace - 10 dict begin - /ImageType 1 def - /DataSource exch def - /ImageMatrix exch def - /BitsPerComponent exch def - /Height exch def - /Width exch def - /Decode [1 0] def - currentdict end - image - grestore - } def -} ifelse % PDF color state -/sCol { - pdfLastStroke not { - pdfStroke aload length - dup 1 eq { - pop setgray - }{ - dup 3 eq { - pop setrgbcolor - }{ - 4 eq { - setcmykcolor - }{ - findcmykcustomcolor exch setcustomcolor - } ifelse - } ifelse - } ifelse - /pdfLastStroke true def /pdfLastFill false def - } if -} def +/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 { - pdfFill aload length - dup 1 eq { - pop setgray - }{ - dup 3 eq { - pop setrgbcolor - }{ - 4 eq { - setcmykcolor - }{ - findcmykcustomcolor exch setcustomcolor - } ifelse - } ifelse - } ifelse + 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 @@ -143,22 +100,19 @@ end definefont pop } def -/pdfMakeFont16L3 { - 1 index /CIDFont resourcestatus { - pop pop 1 index /CIDFont findresource /CIDFontType known - } { - false - } ifelse - { - 0 eq { /Identity-H } { /Identity-V } ifelse - exch 1 array astore composefont pop - } { - pdfMakeFont16 - } ifelse -} def % graphics state operators /q { gsave pdfDictSize dict begin } def -/Q { end grestore } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if +} def /cm { concat } def /d { setdash } def /i { setflat } def @@ -166,25 +120,6 @@ /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def -% color operators -/g { dup 1 array astore /pdfFill exch def setgray - /pdfLastFill true def /pdfLastStroke false def } def -/G { dup 1 array astore /pdfStroke exch def setgray - /pdfLastStroke true def /pdfLastFill false def } def -/rg { 3 copy 3 array astore /pdfFill exch def setrgbcolor - /pdfLastFill true def /pdfLastStroke false def } def -/RG { 3 copy 3 array astore /pdfStroke exch def setrgbcolor - /pdfLastStroke true def /pdfLastFill false def } def -/k { 4 copy 4 array astore /pdfFill exch def setcmykcolor - /pdfLastFill true def /pdfLastStroke false def } def -/K { 4 copy 4 array astore /pdfStroke exch def setcmykcolor - /pdfLastStroke true def /pdfLastFill false def } def -/ck { 6 copy 6 array astore /pdfFill exch def - findcmykcustomcolor exch setcustomcolor - /pdfLastFill true def /pdfLastStroke false def } def -/CK { 6 copy 6 array astore /pdfStroke exch def - findcmykcustomcolor exch setcustomcolor - /pdfLastStroke true def /pdfLastFill false def } def % path segment operators /m { moveto } def /l { lineto } def @@ -316,56 +251,166 @@ not { pop exit } if (%-EOD-) eq { exit } if } loop } def -/pdfImSep { - findcmykcustomcolor exch - dup /Width get /pdfImBuf1 exch string def - dup /Decode get aload pop 1 index sub /pdfImDecodeRange exch def - /pdfImDecodeLow exch def - begin Width Height BitsPerComponent ImageMatrix DataSource end - /pdfImData exch def - { pdfImData pdfImBuf1 readstring pop - 0 1 2 index length 1 sub { - 1 index exch 2 copy get - pdfImDecodeRange mul 255 div pdfImDecodeLow add round cvi - 255 exch sub put - } for } - 6 5 roll customcolorimage - { 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 -end -/__tumble { - 180 rotate - -612 -792 translate +/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 LTWFJF+OurCharSet -%!FontType1-1.0: LTWFJF+OurCharSet +%%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 false def +/isFixedPitch true def /ItalicAngle 0 def -/UnderlinePosition -100 def -/UnderlineThickness 50 def +/UnderlinePosition 0 def +/UnderlineThickness 0 def end readonly def -/FontName /LTWFJF+OurCharSet def +/FontName /LucidaSans-Typewriter83 def /PaintType 0 def /FontType 1 def -/FontMatrix [0.001 0 0 0.001 0 0] readonly def -/FontBBox [-12 -205 618 928] readonly 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 @@ -481,325 +526,330 @@ FE8DA1ABE05931A20F8FC365A0F90C9A22578FEBDD03E4201D2887923DD20ED9 2F8F50AA500DE6414F5521ACCBBA45FBD55A4882C7485B52146BD36775948914 F8D5FB4C38AFAA25CC8946C7A7DBA010B186D6B5B07DA514976B3CC03535B838 7B3B0BE3D2A1813A3B406846433DF6235D79BA455E54E35184F42053C1FB0105 -CDB7B017C5BF449CEF69EF7E7B143698D00B249BA50E98D198FCE708667252B4 -E45CC9BE25735FF617ABA79311E655756E2F7993ACB8E4F27F76F14A9088DA85 -6E17B25267A4D8177DEF6684BEB1F400B6B07492E58311CB44EC0B528F8FECE8 -E96A50FC1F544E0F3DDFEC55E4CD9C34AE42CA8EF98BB1901E6D97DFECA023E0 -F1D49EC9054CFEFE87ED611814870C75F636FA9F1430AA5F53C397BD13CE9113 -7B57917BCBD964A8370F3FBCAF0FBC80BB0527B5E1C9DE292498096D0570A220 -444B3E5CCF7F32C09338E4B393D1528267A5CEC43DE04EB0A7D3E802146533F8 -5BE541383085700F322990AE9C7400CD2CD7031F05FDFB9D4825ABDB38E904C2 -096B183D3D32C10A5C0391DA6516282D95C06E54EFBFA34282AE4D4EE0D87D9E -D0F41D3FCD7CEA0794E2A18A5F8092950BCA3B49A1A88A6A49E54BFC5BD354AD -4B58480C1F9136A0D2B34C96E6FAAC235DA8B5A643E94CE0A3924CD4A9C07F8F -CEEF6DB90ACD50F9438B78C1A7BB01F9A52B1A80F6DB7D5C0E26A3929939FCAF -91A90F63E448D6B2513B8835B3732FB96A449289BBCCB20C65A77EA718C25FC5 -AE7C12089733357F89152E2667276AE55358EAA697CF0BA0031AB617710FF229 -571046B5EA6B5EB93FDEE581FAB465EEF10F302EE7C5E39DE51A3C8B3FCEF031 -9819ABC8FD2E80E6D0073E638992185B3C5301267853F69A9E0D969D229569C4 -D59E062DB6A53B5F82FF8ED7584D27CE27EDEEE8C6C31EACC673C18CF53B1D72 -419639DC644D9C1CBD370CE96E8D28C9ECA7F37F26989C125CF0B6B806D8B4D6 -2E1CA29F891ACDCCEBBFF5E2F8BE1D59AF78E01A10B841624499DC224081C1C2 -006938615363E596D014BD38E4729DF9AA2839500FF70D246873CE23A99DD173 -6E4AA28598A115331ADB40913F876D05B8F89625A122CD752A60F2180D971AD3 -486C49066503E24C50F5F4975C2EC545F051BC46DBF96898A28B2F09B608ECCB -57D2499B735ED1C45DA6BC1778273180D9DCC6E15C7DBF9F53BDFF46569CD7D5 -3E66E85372B5A5D8CA62B906BD4CF56F0336441349554A5EF4C43837B83471FD -6CB4FABBADF99FEE2AA79354678722725927BFF26B7797AC9CD034474F889C41 -403BCB546A701285EC285C90A7F69ED5FCFC6E1E9928E71999C408089A3D48C7 -136BB77E9165624383400B324F50F3F88AD03205515A33586CEA9155C3FF70FA -CC1397107C484B8F9FD71F8E37265B47F8A28D50471A0539FE6B89C354A5ED46 -2A0ED3C91DD90FE617D27C70E86A3DC1C05BE7E99D527B681E0141A787139940 -FE22F116C428EA79BA326F462007EAF2D2CBFFEEA47D0A04840728FA57516073 -FC9E482B25CE59A3951841FCB2994A454DBB17F56A629310E128919D60017178 -4DE9E614779A44F400845C4905C13E75EF17E7D5653A62613E7BDC232674349F -7B0D86E1D499F42964E9CCECF15FBB0B557B0BC864CF475BF309B64BDDED98D5 -D2B23DE6EAB32C8C3FD3D930ACD6288A80713148FD98BB757A8740B1DC48F757 -3B19A56CB146FC5F38F3F89C44C4AAC71EC2F65E6024E15F805EF905F3A45094 -289D38BF465D7E90EBB6C64C705D505ACAFF0631135855E9905C54808A9D1E53 -B24360028BE452FABBFF72AFE83F9A26B7101C6E9D4DAB8AA495E19AD99490B4 -870615F47C4135E29EF2178CED745490FCDB229E04FED8353A09DFA1448E3892 -75D7480CD30611AEBBEB051F8F6E5E90B487263DC92F34EF9D1951A40EF2FCCB -3F5DFEBFCE277690B90A82291198B12C535EBE18E2206878829EFF8567B85D89 -CA7BEBC9FF25FC6411D78C1A07FBE98104041632129730E371AD0054A4B74E48 -CA21E60DB8AD10811A91CE4CC2A33D3750A0838643CBD5CE4E94566AACBA6146 -926594ADD73AA1E4A48A3B32B4300B13750E4298EF23E77CF2923F8B95926603 -16EDE4B6AA04E53CF708876C051A02B95D076BB4D754F4057C13EF0C9CAE1E02 -D969A5CD0C82ABC080F3CB65F672344D201B927676B2C80EC6BDD30BDAEA61B8 -6297D34A4BB3FCE96A8762161588AC43116550E8E6CA631B4F4DF540F03CBC41 -046C2CB4547ED81370856486665CA480DB67F6B00727DC6AD77BD78F9EED9A35 -BCF3E276E8BCF746E6BC38A59DD2171B87256AF5FAD646378F8E7DE26ECEA4CE -7089E042EA0A7557C346AA6F8DD6CA1CB9D581B5AC86EA4F6A3B257E286F22F2 -C9CAD0DD32B0FF6798C83AE03B3168F70F7C7C849CC7C28F04F6CE8B6A6D0CF9 -23114D99AE626E926A170751F654B7B268A8934C25EC195D43941F241CB36819 -277B9CAB40F6EAD122B75DA9DD7918C8E5406AD44A54B3733BD01190CFF3740B -4C66E2D58D4682DD41E8F9580570A302FF450C375D9247DC8C8DBD38E48E04FE -F14D0650A63A5290A806C536E1F47EA00B13C27D8958F3332B9FAEE59875F289 -7B224AB3EEA0CF879F56914E64AFD23763C661CCC36FA6B750EE28A1388C2664 -AFE3DB6D09D3E21168A72A82DEED295BC44FC24A4EA46A02AA67447F7374DE34 -3CA0ABAA0777FBBF2D02FCDF58F4783A1823DA35A54CA3A6069FFD7B9960AD3F -7E201A14A202BC5DEA12A40F12FBD779568CDE23DF90AD3EB281D5D63FDE864A -6DBE38FF0FDE4E222EF669EB29DED49A900DC9678D37DA2BD520D9A7C878D4DE -5877B8A6451CCC50B59D2455137CEBEC65CBAF609A00DE3CADFCF818C56409F4 -871107C839043D6319CF2D57B2F94B524C8B9D64C8C4420E0D630471161EAB9F -D74449EBBDFEFCD9DEF0B39F4BF609B852394519F8697B42962BCC1499BF77A8 -B02A695893533389BCD4B204FABCA016459C53D08426AE31A23F52497DCA85F8 -8E19D62AA5AA45E3756BD0D067C510ABD271ECBD8B2A0466CB4AE70950C9A971 -9FD6264399B34D82B9FD7169103BD48886226F267158FCF8E9300A04E4BDE133 -06781119AE5C210F3858A00DCF23AF6D0E83FE052774EED1EF733075663A6599 -19A31B51A977380648DF55CF9A088A864A55515B28D7DC75730E05CAD07B3A2C -818D43625A27F7284243AB26A90E2F80706DCA1676815313EC98F545D8EB02CC -1D1A710DF5C183EB8D7CEF837986556B470C7C0DCFE193047521CCB067226571 -7C4929829A218FC50D522D4239F6B5C8D4A3E8006DE102A4873620AABF1A1FDD -BF94D362FA7B23EA59B8B07828EE49B2E825502960EFBB7F27246F8784797F54 -3CDA02F9E8408E12F3F8724D465C73993321E8368D8E3FC8FE823CCA34042D72 -159038A933CC6618627CC8755E72EC6B3FE4DF5F36D59E99409C6D4F7399936F -91DC03F065003B6AE676AA39B0D3F9746053E18B16C085F5D74C0FC3B6B00E99 -FCCE3590271AA78A76BB36248B7B9B00DE62EE0C6767690228CC5F97CD27107E -D483D52A34182070A54EC20304CBC4763863735EE0C4941277755FC985CF6A9A -D95C8A8DEC8DD9734BC35578B79DF8EB140EEA8C622DEFED33768625FF197B19 -1062FE5B7BC0C3E2EDF8F404477E4A0652342370889232DE662578DB1AE2DA0F -B7612DB64253390460682A6EFD5DA4D3316491DDCA92269289EA782FDAC82A76 -FFE4181A6BAE23E0E539F31AF2CC0C9CF4DBD569C44598CFB6029B50C1D74151 -D98FC5FCF0248778CCDC4F7B59C070E1E7D3FA8D4030178E1F02382C69B0338D -E2296378105DCAEA8AECAF50F8B90F1F2C20B03201D27B7AB1D633DA02D1626C -B6FF684677B042CE5BC5C9668BC1D959B8E666BF00EF10DA7C450FC122DDA86A -BC227BEB160C8F870A9A0BA1CC9ECF7A37E95186F150A3507E0AB6766E1E82BE -7C3E8C7C9C832A89127D7728C8BF89EF8C599F9ED7DAA8223FB2531AD7CC7381 -918E6EB3386DDA03501A83D1BE49F381EE5C8BCE02432BBD93E7E145F681923D -814DF79DE4CEA10E025134E81A1A947F1E62EEAF978EF4B9DADC322881A88090 -F1EE06A5DB1273F87737B35357651B77EC8D3E488BB949A2AC288FBA3C78C217 -FCD52E3BDD13C610022F53617775B14752AE4FA0E5CC39CB66B9539D33C711ED -0F712DF81A28E42AD90C6AE2FAAD9C07ADF0A5CBA487F2D392E294069592F214 -7BB688CB4FCEE81D2518BCBD21B04E2F3F9BE8DE6BF0640A667E700E2EC5414C -9F42F26FAC0923BAF78F63E03321E8BEC2332A8BE703C23457B1EA2448F7B48F -CC7BED855283A132869D38A43D74948D1EA165CAFB6C1FE35A426C23436C411B -C9B81EDCADE1F79F2A16963F609B8E5C8D9547FE8BBC20EBCB421D3D7510EF3F -D801AA9C68B389310E6394952C72BCC2252946260CAD4EC880F69D95AB07AC90 -C6D0C8F95B72CA274CB690C5334B73A2F3B8B9CD6885E431E36FE16430FEB750 -FBB8A3154BE9ACB2F3837E5A69836832F4FF6BC000EFC90167B450916892C728 -D3BEE1F49B276C57BB298A646233A669BCB011179693BCD8AF0E09F14474EDEF -A34936392F66C296A8050F79458AA8F10FC95954CA98096604B99859813B488D -DEDACC162AB1330B9513B17F434A11F6E76746C180FF9B0AFDB4097453C6E1D8 -2B0290CF6F7B8119CFBD59D6FA3BD32BA2D40E6266FB10520A71B734C502B46D -B96F597BBB18FDE6A61BCF7A9DACF524AC3B8C7770727BDB14850E3E6350A3BE -6A5D849BBEA78FA4C973DA470D984C3D2234AF68171A01D7F1E573FD3C9DEBEB -8A77F12916D9C22CA7026CAF1274A9C280FBE5089DA3EA526F9C68BC986A8B7F -4743E87A10196A1E3B9BC621B614CA32F47A171F8DF9D83A6294E796835A98DF -3C87725116BEB93D30C065EE4DFF5BE02E253F251647F3A6CBD9F8066884FA9D -7372CB758C1EC8B19D9B3E85919453B788D6BA4EB55CC047E00AB8ABA22F9001 -4D7076D1B14BF9D9258DA19F8BB89DA70504254FB9D82F5E16F00576319F20FB -98B680758D7435BA34E98EF02F5C8CD16A1062B35A42B2E522D90435072D3BD6 -5FC64AFBF541BBBF497328BE21F36B4EEE20EC18F41F3A985C49BBC05AFDA137 -06F850F85BC991B658EA5DD6504A43D64664900026F08F5AD0657E81CB4B6394 -29F8518C7F3A0CCB787EC827DF97B4EBE133AB28291C3202F7AE1E45DC8EC498 -367870A9C9CA93AF3053D334DBFD307AFA2C421D2DBF465605A711568CAD060D -9C92373F4317EAE7B74228CD32BC3FE7289935DAAC9A1C95D67386820B478C2A -E7A76926BF9EF3B372A9F4A5C98F30BF2A46C1A0C393826191BD343F0DFE5734 -DC38658406967441AE18C73FF0D2E70CC88255385E71F1FD5EBF85D4CCD4FD4D -DF5D02A2C7FD38CCCD29368B7CDE2AAF50B716AFA07470692E6AA278DED84406 -F52643941EAA6ABDE13E948EFF746D506052BCFC45293FC75B3183A188712D37 -11F81585E2279E301A9C967533959B0D99819435ADF4394EAF23C8432E8114DD -3DA40F4C2848A9A131403152773371ADCB6ADAE608A0159B3ED1DF37BCA6D1E1 -DE7261DE98D26A75FC64B23F61CBBF5984DC45112F3E44D9BADFE9372A8AD035 -D966F9D87CB5F831B40D6154C29DFEFCE905AD2F0F525DBA7A471BB8175A6E57 -25598FD243FC0282D2D41AFB41FAF75FC48413DB128475A00BB49E23E1A47C70 -657F84F3D09D66974B98DC898991A6DB7C7EFD32527F3FA56E9464793D47C5CC -17631250AA37B1B7EBD972D379110778F7033B7E10875AECAF5226BF9C43C330 -E66639348E444F7A246D456A678637E6E4EECD1FB25C25A7037C364EB83DCDB3 -4A6FCA2E36E71754927C30A0BC968164FFF79F210D8913A4A03A90EE3F03A860 -4FB7D7513ACF84D3AD96E011067A9794DC09DCC003223A95CDD49C065A247105 -A77118106D8B301D12292C657432A4457D8FEBA4E605FD1D528F2ED51C972831 -4CB7A88AF1088B303598ED0BFDF520755E683F2267C50A0770AF901A7C4F830D -AAE9691172D8CADBAB44276AEB5BFE3D60B23807BE33B7318B0F31D9D1ADE720 -670BC376989C51255259FE3231B842A200051006831B65AE59CA723A3E958FDF -0B10CBC82E0184DA8FE9D172B76AF9472BEA2794FC1A4D6D256AD61A9951C388 -09115F42846C880AE0DA6B0C719BDA2773306957F2C46695104D436C27CC0F5E -FDDBCF9AF99A8E94D7057E10410BCA5C8871CCF35F6640BC5EFF590C3528CA0A -2B754DC5219EB8A95B33FB15698157565102FDA281A7C32C65FF594892ED419B -0EE181A5535E3CAD898C9911A1CEF440A38301D930E534B6BE1142F214456CA0 -6B63D5F854E389C5CAB3C52713004004606CEB24ECD9630330F7DDED6E3CFD05 -E058904B16B3F198EB4A727DE5C24FF496D081A4F149244A9E9A563FA271EA72 -CE24AA04328A612060B88F2ADDCB21B1843B5B8CA7F1521B1D503787A9742FD0 -22C0A7EDD92849E87CD6732D753232392CB0CDE9DB9CC77641F8215EC7C7FB10 -202045EFAB63262F1F21C459A294628886C0D5A677ED6EDF183E92BA7A311456 -3F543B8E3032442269A1474114371F25E7411B3CBB9B1397B2CC7C193C0E0264 -E21FCFA9BC47115422E28D0033F20F9B898CEEE6A1507EB81E54427E2024C67D -24DE610ED650D41FD7618201FA16DFB017890E2E0C5AF82216FC043D3DB21F29 -44748E3BEC5E5049AAB86DFB85AB9F891C2C564D7227C4F9A05B4C8F5CE44BB5 -5524183F6CC7BAD349D94C3C40A22F074F731DCC986D475772005074BFCE608D -BDB002FBD772517D4B43A534081DB7B95AF23D84CF395376D8F9BD6A7B0AD7CC -F9876E644B9CE1D0ACA576A749FBC65A6F56E625D9891096C319C0C355E8518D -C708F6F9F17514C8C5543E8CABEF72B3E5AB01BC676632D2AF90A593346735F1 -446C775B2972E52632DA18869784D610890589D9E899CD9BC98641AFF1506352 -845E206C10FDBE99462B273231986D5E9C74F9B747F5378B7E294B14AC65D35E -79CF4F095347A0EBEAE012D2BFB30BD241141B9F1FD70776E4CA993E7ACFCA53 -3B2CEC09393E72082FCEF5AEC847861C42B498C6F68B14620C4E3FE298C67234 -B9D05A74945CA5C549CC1169DAB2614D0F0FE3209B1D063FBD53DFB97EC0E40F -F398B9A3363B6DE30E47726496A6B2DE2FBD8341C3F7FF2FC20C3589ADAD353B -5CAB95C83A62AD97341C39276F3FB20756EC51464EE631F9DDC50D6AC8BE2482 -5E5341EC76366A610E36E9276893FBF05E7E0FFDDBBA50A13FE23F97700C7CA8 -A8DC0EC182378399ED1ACC44868D4E3A5FF4E7E9D9FB84AA72E868097CFAACB6 -9218465A00019D5D10A41AD270539F2757516DF0DE79ECE5AA4C90603C4C40E3 -D1B57ACB536CD43148EB7389D7D2139BFC287A5D63A89F8D2BA1BA2EB7F6A7A1 -A42472571FEA3C655856A6207D6F48EDF7BD0EDCC0A6E118E43DCA4870431C54 -02B9F9D6DC7E7D82526BB50A15BE15619366AD054AD489EF0E8C812DB50134F7 -F36D356D7B8AF6BA016D0A683FA662CE2809037915A9200893D352CEE4A8A539 -F4DF1320F72585E59943F6A3EE2CBC2E020C17F5391E1045B190CAEF1C0297DE -45F87701542146D953F99FE0E6A23FC4FB081C8A2A3A89F2028F51DFEE278D98 -2FFAB44AA4122E8175074BCA6928252D4147F8A7115161D512DB3410F1762CAF -16211C8FFD8C082F292D7944D508F2BA2FA7AFE471B35BA4B933B6E6E2DA4107 -81A9737C42DE3D56E55C002D83190D893743A3A2200D5B43F7E10F8B4735EEAA -C5F911660F1C172CC1E5C4036098C0AFE71958B01FC261C70DC2C4BAE0A25254 -DEF0801BEF762156E673B69D359962F482E79EF5EC599D1B800E6111576DD289 -3D88CBA03D849DA14E865EDD612E34561ED626EE51BE0B7EBD995FEC2DCD1E1D -1D13FD1EF101E572B732D69961D91E0130CBCB1D0F79AE3E5AB68E11E0B208CF -2B11BEA9FAD42C67E63E35BE7E410D1725B1DD3532CC7F4730EDF325AB77C0F7 -93F39B4D89CA618FC6964C5EB58128DF2BF997000BF3A43341FADBD1FA6A577F -B86018A21665D509AE01E02B73B36FA0BF1A434809512D70ED1231A49FDF5C17 -8A859F63E1C726069232DD0C4E6F9AD64BD7199AD19F14B360D906F40093B84B -9B52A33F36D146E2B5264E53A41745DA30BD649E8CDF2B0871887996BD22D025 -8A4F8CAA6EE7D67E4E36D900DF0B8F31B5A1B10893CCA13A23734A2F6FD654D6 -0E1C9B0A73D59EE66DDE4E8F0C9FE805BF4AEC6F54F25AE66113BCBAE85FA720 -1322EA828073DC235AF729562F888A349D6C5D40CAFB28C495D8BDAAA8E93C4A -4DF630094A7BCEC8C63F1BAA8F28F1BB4BFE28C30C5CABDC6DF2A31B246D3840 -C3642A683A551D3E605F0635773FF926F37B3017F75CF70E1C02B335DF9BB2B6 -25A634897D331FC1A3C23050EC25AC7B68B77BDF239DD2263DCA7893DA7EE147 -2842626C81FA4E487BE92876563211F4BF13B27BF3040021E09C9EBE30B1E342 -86E128E15C2AB17A47C10164862A4286B0B5164F43D9055E18E003A96BC41F52 -8E8EA4B37C0475510AFC513707D649527468E0D6843196AB2CD65B59967B956C -95B2F98CBBEF2B900C65F581A1A4C273C1626131653C2CB2E78152ECCD8F2BBE -C6F6B99EE6958C92B1C4B555AFFE911BBEAC9A2AF10BC8EBF41C2FA6929F414C -CF5088B60DC6F3CDFECDC1169687333E8E42D2E756995DE5EFDC7F1F21B63627 -14AF8CD7B1EA7C84256332F6D2231BE5D6FAE80379CB0132A4BEB397A4D27375 -71D9B6AC8D466E408CED3A3C8D73E078BFE44EFE531433E41250752711EE6B99 -B6C5A8FA6CFAA3F858806A58D06681E8191C02A1555BA9A45FCECD26B6E7A4EA -FD38B456CE576063E87567B9AB3BD3114220E4B4D24B3CCE8BFF26A01A658D96 -50A133E9AE039A6D39EAB0993ACBE8F71C60DEE0A25CADB02B1550C4E5F5406E -238DDA885BCAFA01739AC40559A1FEC332706D9D1DBFE7B7AF9F2F6FB86F9706 -610809706FD7C80F35BBE8252E5E4A978683505F15E2AFF2F5A69F33581133A8 -5F261E686A495B74F7F6BEBE0ED509F0B0FEB387E632195B203ADCAA21FD6405 -B4634EFAAFCC5C5E859E82B7E52FD3B1AAE99898EE6622E40217BF98695468C2 -0E4703C8862208692C12C884AA8D65CD47FE385782F49E12FCCFFECB31125895 -A2AD4D9D20B7287ACB9180BD15B1657F95E80C324E68647E3D7B95F7F07FC917 -30210543C3851FC1E264A1CD1ED95D21AA479B12BCC9B74E9938FE33B4FD1A5C -04AE0031D88D0DE723F56B21237F0D20BB40E0BEBF7D62152B541118B7EB9E0D -EFB1DB53B3E4AA0680EEF6BC021748D23969EF9E711D95159A4271222F0433EF -720E615CC7BF47E7E401512C39F84D873629D6964CC045B4FC422A56B0CEB142 -9CB1A2CF6EBE92B74B6A1D1CC7BCBBA9E50EB527F0186B1846E12384CCECE5EC -335C4F2E7941E4793C63CF6DFBF5AB7C1286CED77D135BA8D1CD4C6D2BCEE104 -1570DFAA5ED9AB7778DBD2DE652B8038B5C2AEF8BE93CA80CA0ECD571E0BA9D7 -CC8614D176B178FB8C51F170017C70BCB01F28805B4053D0DC933A5A1420C27C -88897D7D4A7029685F6C0F9F255CDBFB6CED05607A0A3A8116D61D96A31BEF71 -5397FC32D6A9B198B085D796FB330791085AAA33AF6D1349F5C93243E37797EE -C3458787AA6EAC5753110237D8CDF153EA4ECF5FBBFFF4098A5A9E64E65E244C -04F61511784F0E0524437209C2873143D9C87EEE272A852FF3AD554BC094C156 -4E6FD0F69124B074E1977DAF7AB3AA7914B64578C99A925818F6D54E5BDD53E2 -2A6A786087EF436909DAC86CB8F4CD595996FA03DDF2833BF1485C9611DC0ACD -7366EAEB31F718FD569F1EA3D772945D347771B175D3B488D5F12587A2B91211 -0D5F37EE9FDBBCF9DFA3F7E104F53D80886AFEDF48F0449192EBEF6036278AC8 -9002DE452516EA28C9F3286D42DAA0F78A1B4BFAC7EC35D7E45A99AC66111052 -1AA6A6CA1FA68284997CF7A7674E43B40261177AA982657A7448C1F1DB05DBB8 -CFAE02FFD09F584D1B0B29E1F3FB7DC908021E0B854EBADAD8A833605FFFD1C9 -5D1A6C2E8CD3EAE89BEE21B3E9622398B610223ED6733D5C30DD37362324F2FB -C764FCFDBE7B7EFB247A618016BD74BFD1C39420F6D33FFA6154898B62AB0444 -8B049117E5452A5B84CE45F48389B7AA696F3B194C04EEFA9CD79E1ACA160699 -9E5F7DE8027195E2559D0FA4A59A70CE1266B69F422FB62EC102482620FA09C6 -1B85E545596D226545AC83C89B941A3FA95B0704EA34C4E9FFF8917F1A611E8E -0C9F8A4A8A3F3E9DFB2D3C34EFBAD3C6218B8624EDD9F77E7FA30A8A080EF8A3 -F360D8671D0692EB118A3E83C7140CC161E5E0011CC15073E9B30894354973AA -BAC1DFF1C0889CFF50CF070A806CCA9B4A869E5E15EB345E5686764B142F6B2A -F198443420B930CFD9441720C9BC3A17CF6FCB40ABE90EB198DB21259D402F03 -DE7C84D3BD01E9800348EF8F0B5DCC76D45E7E0869846CAEAF5535EFC15D5D32 -9BDF9869FA715C14639A3DCA72FD34024C89A2363A7C7F18210CA9BC5A75CDE3 -4C2E98737682AE6D20C37220947D5707071FB50C5077439B38795D64BD1530EA -A3DA77C2D4C39AE44697950B5587D026167856859E679AB44776932D84E00225 -34822AD977566481DEB69B6D71FF394C744492443B0BC7E4201807684082B69F -5D0973DAEF0167AFDCFA7C019EFA4FDEACB014B263EA6B5C8A14FE2ABE63516E -A02EFE7B3BC3F7FFAC46725125D0C0DABEF697E9B2FC9017EA707242073D8C50 -46EAF3A89F2806D16B330AB73D64CB38399BBA1480B6DC038270A34B8B16FB6C -F998C2901B8BE47FC0B3B30B352A436A3322948C97BB47741F4BBB3D9ED51A33 -E7005E22474EEF660E9AC247987008748F0B20A2F6EC487910B8F10AE20FDC51 -BE59F58EB10033CD563F1B24665EA7DD179708813390224241849C02DBE44F57 -EE17A22728C030B95AB5D8BDE385CE9E878E94FF2886C88FFF45E41F0FD783D7 -2A4BD1C6CE2353737DD9272C52DA8AA91D152BA16996484B31E0EF9741D43FF8 -9D4AE17847BF44A2A2EF04252FF904CF2F1FC0AE43BF8DFCB3D9035C2F11D359 -8AB2B94E53FAF40580542230648069C84E9475BC330FDA951A9DE4FB350EEEC9 -039BAC59746AE6E527C19DA1D5E81F1CB5D775FAE7326131D34A5D7BCAD1DD6E -744241BB355593A364F8FFC50244911C2FF6932987CF49AC282F0618800DF652 -A396847B441024CE3B634BCB505B9CBAFC44204A980D4B9EB516F4BD166BB91D -FA4AF61DDB4D94A4A23A727F687A801FCCC9CC81D93C64534259B2D74163441C -70EFFCA0952EA5E9D977E965FBD2B931C78FD9F1727B82EE6EC5C3E5B1FA954C -CE1624EBAFF6AF08DC4026D98CAEC116A4CA76CE7679B7683B323887A201CBE8 -3E08BDAE20E9813D26F7B50CFFFB608794B3E557212102106CF8862EFB170D0E -9E90D5EF3E1EF3DCBF21BE27F70E527FDBA3C30DDDBC8BB319E62BCEA406F423 -B4FF9683313CBC0430EC7CA8887AE2924BDA5E048DB731ED00E4E955B19DCA3E -57158330AE6D18A4047C22D0DCD86F1E5A6C02EBD19D39F81EB46BAF322C04D4 -6101A50AB3C0A6FE0575F36EA3703C96A5E273AADF2E263922065F0D296939F0 -B347FDF7DAE050A8C8C41D38DF5F951E7FF2D69BC5D17F6803774D7D795B8531 -46BC1B2541ACF1435C00C033FF98658B2C0A3B0F45EF89B6B7C2B9220CCEEADA -73FD745AFF710B1BC5BA38906BBAC57DEDE11CE03F206269A0CF77FDF4252FEF -878EE755C56ED29CF4775948F0555714E9BDECD09CA84B4D7990DEB7B85D2C04 -87287A6DC7F6AEAB9F6BF2CC06A1210B8B8405DF2CD29E6B36B767C950C0B8B3 -236983F8CAC70ECB93C3E252A28EF16FC8430CA65DF2F42FB5698AC0922C9851 -1AC47678E99535512247ABE19DF4729F9BCF62F9B155DE7B9201A095E5A456CB -539F469F2B7D22DE5CFD57613652B7A38CDA3ADAC7990F5EE0EDB7345F894628 -13B1FAA7D73201D193F2F6B0E45E02D9391408C589C54DF99BD18E6BABD1946C -1DBDB2889E5085519A651EC6AAB38518F71767A6792036F8E1F5E7789A8C3BC3 -294634D8682498A9E329A8DF7374E0A073439440FE90B551082AAC24C2F03423 -52B89E03BBFA681942D97269117D4BEED5F97CD402569A152927C8E1F42DAA04 -0126AA3E1B323368C16ED5F16EF7DDAC6B7CE493ACFA102128D1FE73AC927B44 -C4D5DE39D8919E1909A69B603EB73CF6B3EFD8503FCF03CF5550825D4D39FCA3 -19065E067C1663A930E50196D34307682B75F07733325F280C30FFF4E895F266 -CF553133A0D31CE4F7E88E4AE2D3F55FA72802D8DD04D7F02495B3D43048626C -2C7020FBEBAB25364ADB70EE16C22C0C9CBCF1281872B5E23AE3688B17E5E0A7 -F38E12C07B9955BC6019786C9CF65D9A4E8EE5C273092DEAF97A92E5AC04D250 -1FA1799A112808F4E041C2E6B3DB25495F690C5E6D9EC0D529E23C28A6317F01 -B283DE471016E9587C6105C862984C7653A3B445C9CAD1C5D8F6E4068ED15C59 -4E16BD6572345A4B94AC1234A0CB46B543D15ECB9B3B11909E32BAEB53E13834 -96FCFC4482455BF5B847EFD142C2716FF6E6A5DCC9A568BFA9D0ECB2FF815B85 -175EE958D523C7F8C95D79DAB5FF776BDE102AB7DF6C81EFD51B9CF9C47DEA99 -42079BF3EA4C1F8C6D4950EB0F16FA591C5463A006FB6B9C07B699B39FEB8ACD -06861753F64845934A846336B5F70C92E43D3625AD4B6E2D5E106B127C8E9155 -65130F0481F3B522F96386B06F90E4848BDEC9B034E2FD70467555F719E2DAFF -7541D1678F9D33CBA501AE4AA5B37071E304FB5B4E5E8E4F242AB00C52CFF06E -77F323F785D42F5727EB0EB4267CF4B43C45CC3F5F898DF6E47DF1E3BCDFA32C -6354FF10AF2AFA95ACC0C87FD5649A4C311FFB7CF17AEDF22186A6927A08CCA4 -DF4A339412E323B07EC6A29532AF771E3CE5C39BD173B82207DF1F87E55B969E -FFFD59A78695DFA711BC20DF71CA13955452854F8378808AD167BECB7470D5BD -217212DCB886B5295FAD290139AA6559380056949AFE444F7C5DBE44E7804EB6 -A075697F7A69EA42147ACF1AB84084DE5EA5FFB355A927B77DC646970275A9FF -05FB84C9B2D2F52AE30FE5B7E35832991F159A419528B2CA39BBCD8F215D54A8 -B8C5CD777CB7FAAF086A5C06D4FB8B157E72E42CA9C0E109BD2270CF91BA8678 -1C9BEF2E8E0F54EBE69E9DBD5D7C20BD9FCC22E782FC9D9EDC420DA1914A158A -AB60234B944D4B534F57E11ABB32F481305CF2FCC696BD46F519C22C25A89DE6 -BC97294D816FC09276506BE4D69A89F99DC2DCE7CA9315FFD818BBCCFE39BBB6 -DB2E31FEA52729EA00495AE1EBFB32A737EB9127EF513F28869DA91E5779F90D -C8342F9243D645DC86F28DDA99791BD54FE9CA2479446F2F25EB82A40F006F6C -DBB7A98B407C16D196EE9B65351BE795693D86D234B38E2566CBF0263D9C13BD -87EFD910F953AB4CDA2CA351B74B30FBE79AFB86BBEC212E0DB9661F24A8E3D0 -81CDCF04D8323B4FEF99FEF72FEDF9EF6C2F8022585CF6CEBED03C0BBF7A58D4 -0B4D72B27E15EC0A20C960A20D0D63606517BBE8D7D72D31A30F583F64B97226 -B0D0EB7EC9BD7E99FA18CDE8B37663AB5558924AFC8AE0A429E435B79A6CFAD7 -A51970C7DD68505BA2FF91F7B1EE86FAACDBD10A50B7F928ED31743FAF44624D -D20FCA7D7FEB5A56D8DFD78D89AD89FA8D5D98F216CCB974A845545CD2276878 -0B5F184BDEF71ABAB21B71360448F6BA9B4C6F8A3B609DEA24675A11CCC78EDA -E3D094540F18F1DADF7E311F774CD06893C0486C57E56462E1C7777C5D09F747 -6EDFD5EA99D1B7DF40D116A270DDAE87057CBF78E1F09144A20CB2F2DD5EA497 -8C2F38B0C013AC73FC48FD1EB6FA4E0FAD127EB8E9421F36F0DF10E71FB2E475 -FFE72569A67E84929378F4146E2EB7893667990CE96BB85B995F1181888D3325 -2B9287DB524600D8592F71F0F3B2BB792A041D0E9CA93D63871E2C6B2A4E1DB6 -B6E0E528C594A75BD3F51A41572E753F364EEDC58E6317DDABD4F1F53416D466 -EFBCB92A7E82CB34DC62643AB6928A7C0A6E54DC5730CC8DC6C70B53FA3DCEC2 -CB11D40721D7479D8C28C385D957BE8E3FFF199519FB11B22B54C2BB7AD40D9C -214E22C93EEE97512014DE402097DF8D93579E91B995A24C89B2DB3FCDF2A2A2 -0799F032623EB41A74DAF015ADC00957421DFF0C8FE0A63435C22E8FA8A4E10A -F536E242654948423E11AC20D90A1438F0AE8210996863C01D45507A0CFE3446 -65DE4EF3EE70260C581F499F89FCC79F0590AB0DF78FA693DBC7F577B061A058 -02E3D3893ED18F8CEA394D943AE99F4A551129D46CC80805E00B6AA7F138C08A -1B111224F228C18966F0786716AE6F23C706AF10A364526105E290C4BB222220 -5D62147BD31BD973CE00B21FC890E405F6E05271FF249AB82E86715F5570D78F -AE61E3098253D4703AA38201A0DC339FE12AF47B2886D6 +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 @@ -810,7 +860,7 @@ AE61E3098253D4703AA38201A0DC339FE12AF47B2886D6 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource -/F10_0 /LTWFJF+OurCharSet 1 1 +/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 @@ -826,23 +876,23 @@ cleartomark /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/.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/.notdef - /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section - /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl - /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet - /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown - /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent - /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron - /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef - /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef - /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef - /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef - /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef - /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] + /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 @@ -850,6 +900,9 @@ pdfMakeFont %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -857,253 +910,297 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 README Page 1) 19.866 Tj -0 -3.92728 Td -(xv6 is a re-implementation of Dennis Ritchie's and Ken Thompson's Unix) 42.14 Tj -0 -5.23637 Td -(Version 6 \(v6\). xv6 loosely follows the structure and style of v6,) 40.334 Tj -0 -6.54546 Td -(but is implemented for a modern x86-based multiprocessor using ANSI C.) 42.14 Tj -0 -9.16364 Td -(ACKNOWLEDGEMENTS) 9.632 Tj -0 -11.7818 Td -(xv6 is inspired by John Lions' Commentary on UNIX 6th Edition \(Peer) 40.334 Tj -0 -13.0909 Td -(to Peer Communications; ISBN: 1-57398-013-7; 1st edition \(June 14,) 39.732 Tj -0 -14.4 Td -(2000\)\). See also http://pdos.csail.mit.edu/6.828/2006/v6.html, which) 40.936 Tj -0 -15.7091 Td -(provides pointers to on-line resources for v6.) 27.692 Tj -0 -18.3273 Td -(xv6 borrows code from the following sources:) 26.488 Tj -2.40798 -19.6364 Td -(JOS \(asm.h, elf.h, mmu.h, bootasm.S, ide.c, console.c, and others\)) 39.732 Tj -2.40798 -20.9455 Td -(Plan 9 \(bootother.S, mp.h, mp.c, ioapic.h, lapic.c\)) 30.702 Tj -2.40798 -22.2546 Td -(FreeBSD \(ioapic.c\)) 10.836 Tj -2.40798 -23.5636 Td -(NetBSD \(console.c\)) 10.836 Tj -0 -26.1818 Td -(The following people made contributions:) 24.08 Tj -2.40798 -27.4909 Td -(Russ Cox \(context switching, locking\)) 22.274 Tj -2.40798 -28.8 Td -(Cliff Frey \(MP\)) 9.03 Tj -2.40798 -30.1091 Td -(Xiao Yu \(MP\)) 7.224 Tj -0 -32.7273 Td -(The code in the files that constitute xv6 are ) 27.692 Tj -0 -34.0364 Td -(Copyright 2006 Frans Kaashoek, Robert Morris, and Russ Cox.) 35.518 Tj -0 -36.6545 Td -(ERROR REPORTS) 7.826 Tj -0 -39.2727 Td -(If you spot errors or have suggestions for improvement, please send) 40.334 Tj -0 -40.5818 Td -(email to Frans Kaashoek and Robert Morris) 24.682 Tj -0 -41.8909 Td -(\({kaashoek,rtm}@csail.mit.edu\). This version is the very first one,) 40.936 Tj -0 -43.2 Td -(so don't be surprised if there are errors or the code is unclear.) 39.13 Tj -0 -45.8182 Td -(BUIDLING AND RUNNING XV6) 14.448 Tj -0 -48.4364 Td -(To build xv6 on an x86 ELF machine \(like Linux or FreeBSD\), run "make".) 42.742 Tj -0 -49.7454 Td -(On non-x86 or non-ELF machines \(like OS X, even on x86\), you will) 39.13 Tj -0 -51.0545 Td -(need to install a cross-compiler gcc suite capable of producing x86 ELF) 42.742 Tj -0 -52.3636 Td -(binaries. See http://pdos.csail.mit.edu/6.828/2006/tools.html.) 37.926 Tj -0 -53.6727 Td -(Then run "make TOOLPREFIX=i386-jos-elf-".) 24.682 Tj -0 -56.2909 Td -(To run xv6, you can use Bochs or QEMU, both PC simulators. Bochs makes) 42.742 Tj -0 -57.6 Td -(debugging easier, but QEMU is much faster. ) 25.886 Tj -0 -58.9091 Td -(To run in Bochs, run "make bochs" and then type "c" at the bochs prompt.) 43.344 Tj -0 -60.2182 Td -(To run in QEMU, run "make qemu". Both log the xv6 screen output to ) 40.936 Tj -0 -61.5272 Td -(standard output.) 9.632 Tj -0 -64.1454 Td -(To create a typeset version of the code, run "make xv6.pdf".) 36.12 Tj -0 -65.4545 Td -(This requires the "mpage" text formatting utility.) 30.1 Tj -0 -66.7636 Td -(See http://www.mesa.nl/pub/mpage/.) 20.468 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 table of contents Page 1) 26.488 Tj -0 -3.92728 Td -(The numbers to the left of the file names in the table are sheet numbers.) 43.946 Tj -0 -5.23637 Td -(The source code has been printed in a double column format with fifty) 41.538 Tj -0 -6.54546 Td -(lines per column, giving one hundred lines per sheet \(or page\).) 37.926 Tj -0 -7.85455 Td -(Thus there is a convenient relationship between line numbers and sheet numbers.) 47.558 Tj -0 -13.0909 Td -(# basic headers) 9.03 Tj -14.4479 -13.0909 Td -(# processes) 6.622 Tj -28.8958 -13.0909 Td -(35 fs.h) 4.214 Tj --0.0001 -14.4 Td -(01 types.h) 6.02 Tj -14.4478 -14.4 Td -(19 proc.h) 5.418 Tj -28.8957 -14.4 Td -(36 fsvar.h) 6.02 Tj --0.0002 -15.7091 Td -(01 param.h) 6.02 Tj -14.4477 -15.7091 Td -(20 proc.c) 5.418 Tj -28.8956 -15.7091 Td -(37 ide.c) 4.816 Tj --0.0003 -17.0182 Td -(02 defs.h) 5.418 Tj -14.4476 -17.0182 Td -(25 setjmp.S) 6.622 Tj -28.8955 -17.0182 Td -(39 bio.c) 4.816 Tj --0.0004 -18.3273 Td -(03 x86.h) 4.816 Tj -14.4475 -18.3273 Td -(25 kalloc.c) 6.622 Tj -28.8954 -18.3273 Td -(40 fs.c) 4.214 Tj --0.0005 -19.6364 Td -(05 asm.h) 4.816 Tj -28.8954 -19.6364 Td -(49 file.c) 5.418 Tj --0.0005 -20.9455 Td -(06 mmu.h) 4.816 Tj -14.4474 -20.9455 Td -(# system calls) 8.428 Tj -28.8953 -20.9455 Td -(51 sysfile.c) 7.224 Tj --0.0006 -22.2545 Td -(08 elf.h) 4.816 Tj -14.4473 -22.2545 Td -(27 syscall.h) 7.224 Tj --0.0006 -23.5636 Td -(08 mp.h) 4.214 Tj -14.4473 -23.5636 Td -(27 trapasm.S) 7.224 Tj -28.8952 -23.5636 Td -(# pipes) 4.214 Tj -14.4473 -24.8727 Td -(28 traps.h) 6.02 Tj -28.8952 -24.8727 Td -(56 pipe.c) 5.418 Tj --0.0007 -26.1818 Td -(# startup) 5.418 Tj -14.4472 -26.1818 Td -(28 trap.c) 5.418 Tj --0.0007 -27.4909 Td -(10 bootasm.S) 7.224 Tj -14.4472 -27.4909 Td -(29 vectors.pl) 7.826 Tj -28.8951 -27.4909 Td -(# string operations) 11.438 Tj --0.0008 -28.8 Td -(11 bootother.S) 8.428 Tj -14.4471 -28.8 Td -(30 syscall.c) 7.224 Tj -28.895 -28.8 Td -(57 string.c) 6.622 Tj --0.0009 -30.1091 Td -(12 main.c) 5.418 Tj -14.447 -30.1091 Td -(32 sysproc.c) 7.224 Tj --0.0009 -31.4182 Td -(14 mp.c) 4.214 Tj -28.895 -31.4182 Td -(# low-level PC) 8.428 Tj --0.0009 -32.7273 Td -(16 init.c) 5.418 Tj -14.447 -32.7273 Td -(# file system) 7.826 Tj -28.8949 -32.7273 Td -(58 ioapic.h) 6.622 Tj -14.447 -34.0364 Td -(33 buf.h) 4.816 Tj -28.8949 -34.0364 Td -(59 lapic.c) 6.02 Tj --0.001 -35.3454 Td -(# locks) 4.214 Tj -14.4469 -35.3454 Td -(33 dev.h) 4.816 Tj -28.8948 -35.3454 Td -(62 ioapic.c) 6.622 Tj --0.0011 -36.6545 Td -(17 spinlock.h) 7.826 Tj -14.4468 -36.6545 Td -(34 fcntl.h) 6.02 Tj -28.8947 -36.6545 Td -(63 picirq.c) 6.622 Tj --0.0012 -37.9636 Td -(17 spinlock.c) 7.826 Tj -14.4467 -37.9636 Td -(34 stat.h) 5.418 Tj -28.8946 -37.9636 Td -(64 console.c) 7.224 Tj -14.4467 -39.2727 Td -(35 file.h) 5.418 Tj -28.8946 -39.2727 Td -(68 8253pit.c) 7.224 Tj --0.0013 -44.5091 Td -(The source listing is preceded by a cross-reference that lists every defined ) 46.354 Tj --0.0013 -45.8182 Td -(constant, struct, global variable, and function in xv6. Each entry gives,) 44.548 Tj --0.0013 -47.1273 Td -(on the same line as the name, the line number \(or, in a few cases, numbers\)) 45.15 Tj --0.0013 -48.4363 Td -(where the name is defined. Successive lines in an entry list the line) 42.14 Tj --0.0013 -49.7454 Td -(numbers where the name is used. For example, this entry:) 34.314 Tj -2.40669 -52.3636 Td -(namei 4610) 6.02 Tj -4.81468 -53.6727 Td -(0333 4610 4709 4758) 11.438 Tj -4.81468 -54.9818 Td -(4808 4857 4866 5264) 11.438 Tj -4.81468 -56.2909 Td -(5277 5362 5410 5490) 11.438 Tj --0.0013 -58.9091 Td -(indicates that namei is defined on line 4610 and is mentioned on twelve lines) 46.354 Tj --0.0013 -60.2181 Td -(on sheets 03, 46, 47, 48, 52, 53, and 54.) 24.682 Tj +/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 @@ -1114,7 +1211,10 @@ pdfEndPage %%Page: 2 2 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -1122,437 +1222,449 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 1) 25.886 Tj -0 -3.92728 Td -(acquire 1805) 7.224 Tj -24.0799 -3.92728 Td -(4533) 2.408 Tj -2.408 -5.23637 Td -(0282 1805 1808 2111) 11.438 Tj -21.6719 -5.23637 Td -(B_BUSY 3308) 6.622 Tj -2.408 -6.54546 Td -(2215 2272 2313 2320) 11.438 Tj -24.0799 -6.54546 Td -(3308 3904 3905 3907) 11.438 Tj -2.408 -7.85455 Td -(2335 2355 2368 2403) 11.438 Tj -24.0799 -7.85455 Td -(3921 3923 3973 3978) 11.438 Tj -2.408 -9.16364 Td -(2431 2619 2667 3791) 11.438 Tj -24.0799 -9.16364 Td -(3981 3988 3989 4021) 11.438 Tj -2.408 -10.4727 Td -(3833 3969 4035 4190) 11.438 Tj -24.0799 -10.4727 Td -(4032 4044) 5.418 Tj -2.408 -11.7818 Td -(4327 4359 4442 4930) 11.438 Tj -21.6719 -11.7818 Td -(bfree 4152) 6.02 Tj -2.408 -13.0909 Td -(5004 5054 5663 5684) 11.438 Tj -24.0799 -13.0909 Td -(4152 4414 4420) 8.428 Tj -2.408 -14.4 Td -(5710 6509 6578 6747) 11.438 Tj -21.6719 -14.4 Td -(bget 3965) 5.418 Tj -2.408 -15.7091 Td -(6812) 2.408 Tj -24.0799 -15.7091 Td -(3908 3965 3996 4006) 11.438 Tj -0 -17.0182 Td -(allocproc 2080) 8.428 Tj -21.6719 -17.0182 Td -(binit 3944) 6.02 Tj -2.408 -18.3273 Td -(2080 2112) 5.418 Tj -24.0799 -18.3273 Td -(0316 1251 3944) 8.428 Tj -7.10543e-15 -19.6364 Td -(APBOOTCODE 1603) 9.03 Tj -21.6719 -19.6364 Td -(bmap 4369) 5.418 Tj -2.408 -20.9455 Td -(1603 1612 1621 1624) 11.438 Tj -24.0799 -20.9455 Td -(4369 4376 4380 4383) 11.438 Tj -2.408 -22.2545 Td -(1627) 2.408 Tj -24.0799 -22.2545 Td -(4389 4495 4572 4574) 11.438 Tj -1.42109e-14 -23.5636 Td -(APIC_ID_CLUSTER 5856) 12.04 Tj -24.0799 -23.5636 Td -(4664) 2.408 Tj -2.408 -24.8727 Td -(5856) 2.408 Tj -21.6719 -24.8727 Td -(bread 4002) 6.02 Tj -7.10543e-15 -26.1818 Td -(APIC_ID_CLUSTER_ID 5857) 13.846 Tj -24.0799 -26.1818 Td -(0319 3913 4002 4112) 11.438 Tj -2.408 -27.4909 Td -(5857) 2.408 Tj -24.0799 -27.4909 Td -(4120 4160 4165 4170) 11.438 Tj -7.10543e-15 -28.8 Td -(APIC_ID_CLUSTER_SHIFT 5860) 15.652 Tj -24.0799 -28.8 Td -(4223 4258 4282 4288) 11.438 Tj -2.408 -30.1091 Td -(5860) 2.408 Tj -24.0799 -30.1091 Td -(4384 4410 4495 4530) 11.438 Tj -7.10543e-15 -31.4182 Td -(APIC_ID_MASK 5854) 10.234 Tj -24.0799 -31.4182 Td -(4572 4664) 5.418 Tj -2.408 -32.7273 Td -(5854 5898) 5.418 Tj -21.6719 -32.7273 Td -(brelse 4030) 6.622 Tj -0 -34.0364 Td -(APIC_ID_SHIFT 5855) 10.836 Tj -24.0799 -34.0364 Td -(0321 3920 3924 4030) 11.438 Tj -2.408 -35.3454 Td -(5855 6245 6282) 8.428 Tj -24.0799 -35.3454 Td -(4033 4119 4133 4163) 11.438 Tj -0 -36.6545 Td -(APIC_MAX_CLUSTER 5858) 12.642 Tj -24.0799 -36.6545 Td -(4168 4175 4231 4267) 11.438 Tj -2.408 -37.9636 Td -(5858) 2.408 Tj -24.0799 -37.9636 Td -(4285 4293 4303 4387) 11.438 Tj -0 -39.2727 Td -(APIC_MAX_INTRACLUSTER_ID 5859) 17.458 Tj -24.0799 -39.2727 Td -(4418 4502 4539 4575) 11.438 Tj -2.408 -40.5818 Td -(5859) 2.408 Tj -24.0799 -40.5818 Td -(4675 4680) 5.418 Tj -0 -41.8909 Td -(APIC_VER_MAXLVT 5864) 12.04 Tj -21.6719 -41.8909 Td -(BSIZE 3557) 6.02 Tj -2.408 -43.2 Td -(5864) 2.408 Tj -24.0799 -43.2 Td -(3557 3569 3587 3593) 11.438 Tj -7.10543e-15 -44.5091 Td -(APIC_VER_VERSION 5863) 12.642 Tj -24.0799 -44.5091 Td -(4166 4495 4497 4498) 11.438 Tj -2.408 -45.8182 Td -(5863) 2.408 Tj -24.0799 -45.8182 Td -(4564 4571 4573 4582) 11.438 Tj -7.10543e-15 -47.1272 Td -(argfd 5120) 6.02 Tj -24.0799 -47.1272 Td -(4663 4664 4666) 8.428 Tj -2.408 -48.4363 Td -(5120 5207 5219 5230) 11.438 Tj -21.6719 -48.4363 Td -(buf 3300) 4.816 Tj -2.408 -49.7454 Td -(5445 5456) 5.418 Tj -24.0799 -49.7454 Td -(0317 0318 0319 0320) 11.438 Tj -7.10543e-15 -51.0545 Td -(argint 3052) 6.622 Tj -24.0799 -51.0545 Td -(0321 3010 3210 3300) 11.438 Tj -2.408 -52.3636 Td -(0246 3052 3068 3084) 11.438 Tj -24.0799 -52.3636 Td -(3304 3305 3902 3904) 11.438 Tj -2.408 -53.6727 Td -(3246 3263 5126 5207) 11.438 Tj -24.0799 -53.6727 Td -(3906 3907 3913 3916) 11.438 Tj -2.408 -54.9818 Td -(5219 5260 5326 5327) 11.438 Tj -24.0799 -54.9818 Td -(3924 3933 3935 3941) 11.438 Tj -2.408 -56.2909 Td -(5487) 2.408 Tj -24.0799 -56.2909 Td -(3946 3953 3964 3967) 11.438 Tj -7.10543e-15 -57.6 Td -(argptr 3063) 6.622 Tj -24.0799 -57.6 Td -(3979 4000 4001 4004) 11.438 Tj -2.408 -58.9091 Td -(0247 3063 5174 5207) 11.438 Tj -24.0799 -58.9091 Td -(4016 4019 4028 4030) 11.438 Tj -2.408 -60.2181 Td -(5219 5445) 5.418 Tj -24.0799 -60.2181 Td -(4045 4058 4105 4154) 11.438 Tj -7.10543e-15 -61.5272 Td -(argstr 3081) 6.622 Tj -24.0799 -61.5272 Td -(4188 4255 4280 4373) 11.438 Tj -2.408 -62.8363 Td -(0248 3081 5260 5326) 11.438 Tj -24.0799 -62.8363 Td -(4405 4486 4512 4559) 11.438 Tj -2.408 -64.1454 Td -(5359 5407 5434 5469) 11.438 Tj -24.0799 -64.1454 Td -(4617 5110 6475 6488) 11.438 Tj -2.408 -65.4545 Td -(5487) 2.408 Tj -24.0799 -65.4545 Td -(6491 6494 6574 6581) 11.438 Tj -7.10543e-15 -66.7636 Td -(balloc 4102) 6.622 Tj -21.6719 -66.7636 Td -(bufhead 3941) 7.224 Tj -2.408 -68.0727 Td -(4102 4129 4518 4525) 11.438 Tj -24.0799 -68.0727 Td -(3939 3940 3941 3951) 11.438 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 2) 25.886 Tj -2.40799 -3.92728 Td -(3952 3954 3955 3956) 11.438 Tj -24.0799 -3.92728 Td -(1850 1854 1962 1972) 11.438 Tj -2.40799 -5.23637 Td -(3957 3972 3977 3987) 11.438 Tj -24.0799 -5.23637 Td -(2030 2061 2227 2229) 11.438 Tj -2.40799 -6.54546 Td -(4039 4040 4041 4042) 11.438 Tj -24.0799 -6.54546 Td -(2234 2251 2255 2259) 11.438 Tj --1e-05 -7.85455 Td -(buf_table_lock 3936) 11.438 Tj -24.0799 -7.85455 Td -(2263 2270 2287 2305) 11.438 Tj -2.40799 -9.16364 Td -(3936 3948 3969 3979) 11.438 Tj -24.0799 -9.16364 Td -(2390 2428 2883 2902) 11.438 Tj -2.40799 -10.4727 Td -(3983 3992 4035 4047) 11.438 Tj -24.0799 -10.4727 Td -(2907 2932 2936 2938) 11.438 Tj --1e-05 -11.7818 Td -(B_VALID 3309) 7.224 Tj -24.0799 -11.7818 Td -(2939 2944 2948 3054) 11.438 Tj -2.40799 -13.0909 Td -(3309 3904 3910 3912) 11.438 Tj -24.0799 -13.0909 Td -(3066 3086 3123 3222) 11.438 Tj -2.40799 -14.4 Td -(3973 3982 4007 4011) 11.438 Tj -24.0799 -14.4 Td -(3253 3261 4614 5124) 11.438 Tj -2.40799 -15.7091 Td -(4025) 2.408 Tj -24.0799 -15.7091 Td -(5156 5172 5232 5403) 11.438 Tj --1e-05 -17.0182 Td -(bwrite 4019) 6.622 Tj -24.0799 -17.0182 Td -(5477 6151 6562) 8.428 Tj -2.40799 -18.3273 Td -(0320 3916 4019 4022) 11.438 Tj -21.6719 -18.3273 Td -(cpuid 0451) 6.02 Tj -2.40799 -19.6364 Td -(4132 4167 4174 4266) 11.438 Tj -24.0799 -19.6364 Td -(0451 0454 1315 1819) 11.438 Tj -2.40799 -20.9455 Td -(4302 4537 4574) 8.428 Tj -24.0799 -20.9455 Td -(1841) 2.408 Tj --1e-05 -22.2545 Td -(cli 0479) 4.816 Tj -21.6719 -22.2545 Td -(devsw 3350) 6.02 Tj -2.40799 -23.5636 Td -(0479 0481 1022 1067) 11.438 Tj -24.0799 -23.5636 Td -(3350 3355 4489 4491) 11.438 Tj -2.40799 -24.8727 Td -(1122 1811 6436 6560) 11.438 Tj -24.0799 -24.8727 Td -(4555 4557 4914 6839) 11.438 Tj --1e-05 -26.1818 Td -(cmpxchg 0468) 7.224 Tj -24.0799 -26.1818 Td -(6840) 2.408 Tj -2.40799 -27.4909 Td -(0468 1814) 5.418 Tj -21.6719 -27.4909 Td -(dinode 3573) 6.622 Tj --1e-05 -28.8 Td -(CONSOLE 3357) 7.224 Tj -24.0799 -28.8 Td -(3573 3587 4187 4224) 11.438 Tj -2.40799 -30.1091 Td -(3357 6839 6840) 8.428 Tj -24.0799 -30.1091 Td -(4256 4259 4276 4289) 11.438 Tj --1e-05 -31.4182 Td -(console_init 6834) 10.234 Tj -21.6719 -31.4182 Td -(dirent 3603) 6.622 Tj -2.40799 -32.7273 Td -(0206 1273 6834) 8.428 Tj -24.0799 -32.7273 Td -(3600 3603 4607 4618) 11.438 Tj --1e-05 -34.0364 Td -(console_lock 6409) 10.234 Tj -24.0799 -34.0364 Td -(4665 4666 4719 4805) 11.438 Tj -2.40799 -35.3454 Td -(6409 6509 6551 6578) 11.438 Tj -24.0799 -35.3454 Td -(5356) 2.408 Tj -2.40799 -36.6545 Td -(6584 6836) 5.418 Tj -21.6719 -36.6545 Td -(DIRSIZ 3601) 6.622 Tj --1e-05 -37.9636 Td -(console_read 6808) 10.234 Tj -24.0799 -37.9636 Td -(3601 3605 4660 4661) 11.438 Tj -2.40799 -39.2727 Td -(6808 6840) 5.418 Tj -24.0799 -39.2727 Td -(4671 4730 4732 5330) 11.438 Tj --1e-05 -40.5818 Td -(console_write 6574) 10.836 Tj -24.0799 -40.5818 Td -(5375) 2.408 Tj -2.40799 -41.8909 Td -(6574 6839) 5.418 Tj -21.6719 -41.8909 Td -(disk_1_present 3737) 11.438 Tj --1e-05 -43.2 Td -(cons_putc 6429) 8.428 Tj -24.0799 -43.2 Td -(3737 3762 3830) 8.428 Tj -2.40799 -44.5091 Td -(6429 6494 6518 6531) 11.438 Tj -21.6719 -44.5091 Td -(disk_queue 3738) 9.03 Tj -2.40799 -45.8182 Td -(6534 6539 6542 6543) 11.438 Tj -24.0799 -45.8182 Td -(3738 3837 3861) 8.428 Tj -2.40799 -47.1272 Td -(6581 6820) 5.418 Tj -21.6719 -47.1272 Td -(elfhdr 0805) 6.622 Tj --1e-05 -48.4363 Td -(copyproc 2105) 7.826 Tj -24.0799 -48.4363 Td -(0805 1367 1370 5481) 11.438 Tj -2.40799 -49.7454 Td -(0215 1339 1345 1354) 11.438 Tj -21.6719 -49.7454 Td -(ELF_MAGIC 0802) 8.428 Tj -2.40799 -51.0545 Td -(2105 3222) 5.418 Tj -24.0799 -51.0545 Td -(0802 0806 1371 5497) 11.438 Tj --1e-05 -52.3636 Td -(cprintf 6502) 7.224 Tj -21.6719 -52.3636 Td -(ELF_PROG_FLAG_EXEC 0839) 13.846 Tj -2.40799 -53.6727 Td -(0207 1244 1304 1573) 11.438 Tj -24.0799 -53.6727 Td -(0839) 2.408 Tj -2.40799 -54.9818 Td -(1575 2479 2588 2686) 11.438 Tj -21.6719 -54.9818 Td -(ELF_PROG_FLAG_READ 0841) 13.846 Tj -2.40799 -56.2909 Td -(2932 2938 2944 3186) 11.438 Tj -24.0799 -56.2909 Td -(0841) 2.408 Tj -2.40799 -57.6 Td -(4568 6247 6502 6562) 11.438 Tj -21.6719 -57.6 Td -(ELF_PROG_FLAG_WRITE 0840) 14.448 Tj -2.40799 -58.9091 Td -(6563 6564 6567 6786) 11.438 Tj -24.0799 -58.9091 Td -(0840) 2.408 Tj --1e-05 -60.2181 Td -(cpu 1962 6151) 7.826 Tj -21.6719 -60.2181 Td -(ELF_PROG_LOAD 0836) 10.836 Tj -2.40799 -61.5272 Td -(0272 0277 1244 1289) 11.438 Tj -24.0799 -61.5272 Td -(0836 1379 5505 5572) 11.438 Tj -2.40799 -62.8363 Td -(1304 1306 1307 1308) 11.438 Tj -21.6719 -62.8363 Td -(fdalloc 5153) 7.224 Tj -2.40799 -64.1454 Td -(1316 1319 1431 1436) 11.438 Tj -24.0799 -64.1454 Td -(5153 5179 5290 5458) 11.438 Tj -2.40799 -65.4545 Td -(1616 1617 1629 1706) 11.438 Tj -21.6719 -65.4545 Td -(fetchint 3025) 7.826 Tj -2.40799 -66.7636 Td -(1767 1810 1812 1823) 11.438 Tj -24.0799 -66.7636 Td -(0244 3025 3056 5523) 11.438 Tj -2.40799 -68.0727 Td -(1824 1825 1837 1844) 11.438 Tj -24.0799 -68.0727 Td -(5553) 2.408 Tj +/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 @@ -1564,6 +1676,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -1571,437 +1686,449 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 3) 25.886 Tj -0 -3.92728 Td -(fetchstr 3037) 7.826 Tj -24.0799 -3.92728 Td -(0611) 2.408 Tj -2.408 -5.23637 Td -(0245 3037 3086 5527) 11.438 Tj -21.6719 -5.23637 Td -(FL_ID 0624) 6.02 Tj -2.408 -6.54546 Td -(5554) 2.408 Tj -24.0799 -6.54546 Td -(0624) 2.408 Tj -0 -7.85455 Td -(file 3500) 5.418 Tj -21.6719 -7.85455 Td -(FL_IF 0610) 6.02 Tj -2.408 -9.16364 Td -(0292 0293 0300 0303) 11.438 Tj -24.0799 -9.16364 Td -(0610 0752 1351) 8.428 Tj -2.408 -10.4727 Td -(0304 0305 0306 0307) 11.438 Tj -21.6719 -10.4727 Td -(FL_IOPL_0 0614) 8.428 Tj -2.408 -11.7818 Td -(0308 0600 0800 1938) 11.438 Tj -24.0799 -11.7818 Td -(0614) 2.408 Tj -2.408 -13.0909 Td -(2004 2150 3014 3214) 11.438 Tj -21.6719 -13.0909 Td -(FL_IOPL_1 0615) 8.428 Tj -2.408 -14.4 Td -(3453 3454 3455 3500) 11.438 Tj -24.0799 -14.4 Td -(0615) 2.408 Tj -2.408 -15.7091 Td -(3550 3561 3577 3578) 11.438 Tj -21.6719 -15.7091 Td -(FL_IOPL_2 0616) 8.428 Tj -2.408 -17.0182 Td -(3600 3608 3650 4271) 11.438 Tj -24.0799 -17.0182 Td -(0616) 2.408 Tj -2.408 -18.3273 Td -(4308 4604 4907 4916) 11.438 Tj -21.6719 -18.3273 Td -(FL_IOPL_3 0617) 8.428 Tj -2.408 -19.6364 Td -(4924 4925 4932 4933) 11.438 Tj -24.0799 -19.6364 Td -(0617) 2.408 Tj -2.408 -20.9455 Td -(4934 4936 4950 4952) 11.438 Tj -21.6719 -20.9455 Td -(FL_IOPL_MASK 0613) 10.234 Tj -2.408 -22.2545 Td -(4972 4974 5000 5002) 11.438 Tj -24.0799 -22.2545 Td -(0613) 2.408 Tj -2.408 -23.5636 Td -(5010 5028 5030 5050) 11.438 Tj -21.6719 -23.5636 Td -(FL_NT 0618) 6.02 Tj -2.408 -24.8727 Td -(5052 5114 5117 5118) 11.438 Tj -24.0799 -24.8727 Td -(0618) 2.408 Tj -2.408 -26.1818 Td -(5120 5123 5150 5151) 11.438 Tj -21.6719 -26.1818 Td -(FL_OF 0612) 6.02 Tj -2.408 -27.4909 Td -(5153 5170 5203 5215) 11.438 Tj -24.0799 -27.4909 Td -(0612) 2.408 Tj -2.408 -28.8 Td -(5228 5257 5442 5453) 11.438 Tj -21.6719 -28.8 Td -(FL_PF 0605) 6.02 Tj -2.408 -30.1091 Td -(5606 5621 6415) 8.428 Tj -24.0799 -30.1091 Td -(0605) 2.408 Tj -7.10543e-15 -31.4182 Td -(filealloc 4926) 8.428 Tj -21.6719 -31.4182 Td -(FL_RF 0619) 6.02 Tj -2.408 -32.7273 Td -(0303 4926 5286 5626) 11.438 Tj -24.0799 -32.7273 Td -(0619) 2.408 Tj -2.408 -34.0364 Td -(5628) 2.408 Tj -21.6719 -34.0364 Td -(FL_SF 0608) 6.02 Tj -7.10543e-15 -35.3454 Td -(fileclose 5002) 8.428 Tj -24.0799 -35.3454 Td -(0608) 2.408 Tj -2.408 -36.6545 Td -(0304 2396 5002 5007) 11.438 Tj -21.6719 -36.6545 Td -(FL_TF 0609) 6.02 Tj -2.408 -37.9636 Td -(5021 5182 5183 5233) 11.438 Tj -24.0799 -37.9636 Td -(0609) 2.408 Tj -2.408 -39.2727 Td -(5292 5651 5655) 8.428 Tj -21.6719 -39.2727 Td -(FL_VIF 0622) 6.622 Tj -0 -40.5818 Td -(fileincref 5052) 9.03 Tj -24.0799 -40.5818 Td -(0622) 2.408 Tj -2.408 -41.8909 Td -(0308 2154 5052 5056) 11.438 Tj -21.6719 -41.8909 Td -(FL_VIP 0623) 6.622 Tj -2.408 -43.2 Td -(5460) 2.408 Tj -24.0799 -43.2 Td -(0623) 2.408 Tj -0 -44.5091 Td -(fileinit 4919) 7.826 Tj -21.6719 -44.5091 Td -(FL_VM 0620) 6.02 Tj -2.408 -45.8182 Td -(0302 1257 4919) 8.428 Tj -24.0799 -45.8182 Td -(0620) 2.408 Tj -7.10543e-15 -47.1272 Td -(fileread 4974) 7.826 Tj -21.6719 -47.1272 Td -(FL_ZF 0607) 6.02 Tj -2.408 -48.4363 Td -(0305 4974 4988 5221) 11.438 Tj -24.0799 -48.4363 Td -(0607) 2.408 Tj -1.42109e-14 -49.7454 Td -(filestat 5030) 7.826 Tj -21.6719 -49.7454 Td -(forkret 2281) 7.224 Tj -2.408 -51.0545 Td -(0307 5030 5447) 8.428 Tj -24.0799 -51.0545 Td -(2014 2145 2147 2281) 11.438 Tj -2.13163e-14 -52.3636 Td -(file_table_lock 4913) 12.04 Tj -21.6719 -52.3636 Td -(gatedesc 0728) 7.826 Tj -2.408 -53.6727 Td -(4913 4921 4930 4935) 11.438 Tj -24.0799 -53.6727 Td -(0414 0417 0728 2860) 11.438 Tj -2.408 -54.9818 Td -(4939 5004 5014 5024) 11.438 Tj -21.6719 -54.9818 Td -(getcallerpcs 1772) 10.234 Tj -2.408 -56.2909 Td -(5054 5058) 5.418 Tj -24.0799 -56.2909 Td -(0285 1772 1826 6565) 11.438 Tj -2.84217e-14 -57.6 Td -(filewrite 4952) 8.428 Tj -21.6719 -57.6 Td -(growproc 2059) 7.826 Tj -2.408 -58.9091 Td -(0306 4952 4967 5209) 11.438 Tj -24.0799 -58.9091 Td -(0217 2059 3265) 8.428 Tj -3.55271e-14 -60.2181 Td -(FL_AC 0621) 6.02 Tj -21.6719 -60.2181 Td -(holding 1852) 7.224 Tj -2.408 -61.5272 Td -(0621) 2.408 Tj -24.0799 -61.5272 Td -(0284 1706 1803 1807) 11.438 Tj -4.26326e-14 -62.8363 Td -(FL_AF 0606) 6.02 Tj -24.0799 -62.8363 Td -(1824 1833 1850 1852) 11.438 Tj -2.408 -64.1454 Td -(0606) 2.408 Tj -24.0799 -64.1454 Td -(2257 2283 3903) 8.428 Tj -4.26326e-14 -65.4545 Td -(FL_CF 0604) 6.02 Tj -21.6719 -65.4545 Td -(ialloc 4273) 6.622 Tj -2.408 -66.7636 Td -(0604) 2.408 Tj -24.0799 -66.7636 Td -(4273 4297 4776) 8.428 Tj -4.9738e-14 -68.0727 Td -(FL_DF 0611) 6.02 Tj -21.6719 -68.0727 Td -(IDE_BSY 3711) 7.224 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 4) 25.886 Tj -2.40799 -3.92728 Td -(3711 3748) 5.418 Tj -24.0799 -3.92728 Td -(1585 3748 3778 6421) 11.438 Tj --1e-05 -5.23637 Td -(IDE_CMD_READ 3716) 10.234 Tj -24.0799 -5.23637 Td -(6445 6447 6750 6753) 11.438 Tj -2.40799 -6.54546 Td -(3716 3816) 5.418 Tj -21.6719 -6.54546 Td -(INDIRECT 3568) 7.826 Tj --1e-05 -7.85455 Td -(IDE_CMD_WRITE 3717) 10.836 Tj -24.0799 -7.85455 Td -(3568 4382 4384 4409) 11.438 Tj -2.40799 -9.16364 Td -(3717 3818) 5.418 Tj -24.0799 -9.16364 Td -(4410 4524 4528 4530) 11.438 Tj --1e-05 -10.4727 Td -(idecref 4453) 7.224 Tj -24.0799 -10.4727 Td -(4537) 2.408 Tj -2.40799 -11.7818 Td -(0330 2400 4453 4867) 11.438 Tj -21.6719 -11.7818 Td -(initlock 1763) 7.826 Tj -2.40799 -13.0909 Td -(4871 5019 5423) 8.428 Tj -24.0799 -13.0909 Td -(0281 1763 2020 2584) 11.438 Tj --1e-05 -14.4 Td -(IDE_DF 3713) 6.622 Tj -24.0799 -14.4 Td -(3758 3948 4086 4921) 11.438 Tj -2.40799 -15.7091 Td -(3713 3750) 5.418 Tj -24.0799 -15.7091 Td -(5636 6836 6837) 8.428 Tj --1e-05 -17.0182 Td -(IDE_DRDY 3712) 7.826 Tj -21.6719 -17.0182 Td -(inode 3652) 6.02 Tj -2.40799 -18.3273 Td -(3712 3748) 5.418 Tj -24.0799 -18.3273 Td -(0326 0327 0328 0329) 11.438 Tj --1e-05 -19.6364 Td -(IDE_ERR 3714) 7.224 Tj -24.0799 -19.6364 Td -(0330 0331 0332 0333) 11.438 Tj -2.40799 -20.9455 Td -(3714 3750) 5.418 Tj -24.0799 -20.9455 Td -(0334 0335 0336 0337) 11.438 Tj --1e-05 -22.2545 Td -(ide_init 3756) 7.826 Tj -24.0799 -22.2545 Td -(0338 0340 1939 3506) 11.438 Tj -2.40799 -23.5636 Td -(0311 1274 3756) 8.428 Tj -24.0799 -23.5636 Td -(3572 3577 3589 3652) 11.438 Tj --1e-05 -24.8727 Td -(ide_intr 3789) 7.826 Tj -24.0799 -24.8727 Td -(3656 3658 4063 4064) 11.438 Tj -2.40799 -26.1818 Td -(0312 2922 3789) 8.428 Tj -24.0799 -26.1818 Td -(4066 4068 4072 4074) 11.438 Tj --1e-05 -27.4909 Td -(ide_lock 3735) 7.826 Tj -24.0799 -27.4909 Td -(4076 4078 4178 4179) 11.438 Tj -2.40799 -28.8 Td -(3723 3735 3758 3791) 11.438 Tj -24.0799 -28.8 Td -(4181 4183 4186 4194) 11.438 Tj -2.40799 -30.1091 Td -(3793 3833 3837 3851) 11.438 Tj -24.0799 -30.1091 Td -(4199 4200 4250 4253) 11.438 Tj -2.40799 -31.4182 Td -(3867) 2.408 Tj -24.0799 -31.4182 Td -(4270 4272 4275 4287) 11.438 Tj --1e-05 -32.7273 Td -(ide_probe_disk1 3767) 12.04 Tj -24.0799 -32.7273 Td -(4290 4308 4310 4316) 11.438 Tj -2.40799 -34.0364 Td -(3740 3762 3767) 8.428 Tj -24.0799 -34.0364 Td -(4322 4354 4367 4369) 11.438 Tj --1e-05 -35.3454 Td -(ide_request 3725) 9.632 Tj -24.0799 -35.3454 Td -(4400 4402 4432 4453) 11.438 Tj -2.40799 -36.6545 Td -(3725 3733 3804 3828) 11.438 Tj -24.0799 -36.6545 Td -(4461 4468 4470 4481) 11.438 Tj --1e-05 -37.9636 Td -(ide_rw 3826) 6.622 Tj -24.0799 -37.9636 Td -(4483 4508 4510 4550) 11.438 Tj -2.40799 -39.2727 Td -(0313 3826 4010 4024) 11.438 Tj -24.0799 -39.2727 Td -(4552 4601 4602 4607) 11.438 Tj --1e-05 -40.5818 Td -(ide_wait_ready 3744) 11.438 Tj -24.0799 -40.5818 Td -(4609 4611 4613 4716) 11.438 Tj -2.40799 -41.8909 Td -(3744 3761 3772 3808) 11.438 Tj -24.0799 -41.8909 Td -(4750 4752 4755 4768) 11.438 Tj -2.40799 -43.2 Td -(3855 3879 3889) 8.428 Tj -24.0799 -43.2 Td -(4769 4771 4772 4774) 11.438 Tj --1e-05 -44.5091 Td -(ide_write 3872) 8.428 Tj -24.0799 -44.5091 Td -(4784 4800 4804 4850) 11.438 Tj -2.40799 -45.8182 Td -(3872 3877) 5.418 Tj -24.0799 -45.8182 Td -(4854 5253 5321 5353) 11.438 Tj --1e-05 -47.1272 Td -(idtinit 2874) 7.224 Tj -24.0799 -47.1272 Td -(5354 5404 5480) 8.428 Tj -2.40799 -48.4363 Td -(0234 1256 1305 2874) 11.438 Tj -21.6719 -48.4363 Td -(inode_table_lock 4079) 12.642 Tj --1e-05 -49.7454 Td -(ifree 4310) 6.02 Tj -24.0799 -49.7454 Td -(4079 4086 4190 4197) 11.438 Tj -2.40799 -51.0545 Td -(4310 4439) 5.418 Tj -24.0799 -51.0545 Td -(4198 4206 4221 4327) 11.438 Tj --1e-05 -52.3636 Td -(iget 4184) 5.418 Tj -24.0799 -52.3636 Td -(4330 4333 4359 4364) 11.438 Tj -2.40799 -53.6727 Td -(0326 1336 4077 4184) 11.438 Tj -24.0799 -53.6727 Td -(4442 4448) 5.418 Tj -2.40799 -54.9818 Td -(4304 4630 4707 4826) 11.438 Tj -21.6719 -54.9818 Td -(insl 0362) 5.418 Tj --1e-05 -56.2909 Td -(iincref 4461) 7.224 Tj -24.0799 -56.2909 Td -(0362 3856) 5.418 Tj -2.40799 -57.6 Td -(0331 2158 4461 4633) 11.438 Tj -21.6719 -57.6 Td -(ioapic 6207) 6.622 Tj --1e-05 -58.9091 Td -(iinit 4084) 6.02 Tj -24.0799 -58.9091 Td -(0274 1523 1564 1565) 11.438 Tj -2.40799 -60.2181 Td -(0325 1258 4084) 8.428 Tj -24.0799 -60.2181 Td -(6205 6207 6217 6224) 11.438 Tj --1e-05 -61.5272 Td -(ilock 4322) 6.02 Tj -24.0799 -61.5272 Td -(6233 6242 6271 6276) 11.438 Tj -2.40799 -62.8363 Td -(0327 4322 4325 4455) 11.438 Tj -21.6719 -62.8363 Td -(IOAPIC_ARB 5870) 9.03 Tj -2.40799 -64.1454 Td -(4463 4634 4876 4959) 11.438 Tj -24.0799 -64.1454 Td -(5870) 2.408 Tj -2.40799 -65.4545 Td -(4981 5033) 5.418 Tj -21.6719 -65.4545 Td -(IO_APIC_BASE 5850) 10.234 Tj --1e-05 -66.7636 Td -(inb 0354) 4.816 Tj -24.0799 -66.7636 Td -(5850 6242 6276) 8.428 Tj -2.40799 -68.0727 Td -(0354 0357 1043 1051) 11.438 Tj -21.6719 -68.0727 Td -(ioapic_id 1434) 8.428 Tj +/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 @@ -2012,7 +2139,10 @@ pdfEndPage %%Page: 4 4 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -2020,437 +2150,449 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 5) 25.886 Tj -2.40798 -3.92728 Td -(0275 1434 1565 6246) 11.438 Tj -21.6719 -3.92728 Td -(IOART_DESTPHY 5919) 10.836 Tj -2.40798 -5.23637 Td -(6247) 2.408 Tj -24.0799 -5.23637 Td -(5919) 2.408 Tj --2e-05 -6.54546 Td -(ioapic_init 6231) 9.632 Tj -21.6719 -6.54546 Td -(IOART_INTAHI 5913) 10.234 Tj -2.40798 -7.85455 Td -(0276 1253 6231 6247) 11.438 Tj -24.0799 -7.85455 Td -(5913) 2.408 Tj --2e-05 -9.16364 Td -(ioapic_read 6217) 9.632 Tj -21.6719 -9.16364 Td -(IOART_INTALO 5914) 10.234 Tj -2.40798 -10.4727 Td -(6217 6243 6245 6252) 11.438 Tj -24.0799 -10.4727 Td -(5914) 2.408 Tj -2.40798 -11.7818 Td -(6261 6277 6280) 8.428 Tj -21.6719 -11.7818 Td -(IOART_INTMASK 5902) 10.836 Tj --2e-05 -13.0909 Td -(IOAPIC_REDTBL 5871) 10.836 Tj -24.0799 -13.0909 Td -(5902 6253 6278) 8.428 Tj -2.40798 -14.4 Td -(5871 5872 5873 5874) 11.438 Tj -21.6719 -14.4 Td -(IOART_INTMCLR 5903) 10.836 Tj -2.40798 -15.7091 Td -(5875 5876 5877 5878) 11.438 Tj -24.0799 -15.7091 Td -(5903) 2.408 Tj -2.40798 -17.0182 Td -(5879 5880 5881 5882) 11.438 Tj -21.6719 -17.0182 Td -(IOART_INTMSET 5904) 10.836 Tj -2.40798 -18.3273 Td -(5883 5884 5885 5886) 11.438 Tj -24.0799 -18.3273 Td -(5904 6254) 5.418 Tj -2.40798 -19.6364 Td -(5887 5888 5889 5890) 11.438 Tj -21.6719 -19.6364 Td -(IOART_INTPOL 5912) 10.234 Tj -2.40798 -20.9455 Td -(5891 5892 5893 5894) 11.438 Tj -24.0799 -20.9455 Td -(5912 6255) 5.418 Tj -2.40798 -22.2545 Td -(5895 6213) 5.418 Tj -21.6719 -22.2545 Td -(IOART_INTVEC 5932) 10.234 Tj --2e-05 -23.5636 Td -(IOAPIC_REDTBL0 5872) 11.438 Tj -24.0799 -23.5636 Td -(5932) 2.408 Tj -2.40798 -24.8727 Td -(5872) 2.408 Tj -21.6719 -24.8727 Td -(IOART_REM_IRR 5910) 10.836 Tj --2e-05 -26.1818 Td -(IOAPIC_VER 5869) 9.03 Tj -24.0799 -26.1818 Td -(5910) 2.408 Tj -2.40798 -27.4909 Td -(5869 6243) 5.418 Tj -21.6719 -27.4909 Td -(IOART_RESV 5900) 9.03 Tj --2e-05 -28.8 Td -(IOAPIC_WINDOW 5851) 10.836 Tj -24.0799 -28.8 Td -(5900) 2.408 Tj -2.40798 -30.1091 Td -(5851) 2.408 Tj -21.6719 -30.1091 Td -(IOART_TRGREDG 5907) 10.836 Tj --2e-05 -31.4182 Td -(ioapic_write 6224) 10.234 Tj -24.0799 -31.4182 Td -(5907) 2.408 Tj -2.40798 -32.7273 Td -(6224 6260 6263 6279) 11.438 Tj -21.6719 -32.7273 Td -(IOART_TRGRLVL 5908) 10.836 Tj -2.40798 -34.0364 Td -(6283) 2.408 Tj -24.0799 -34.0364 Td -(5908) 2.408 Tj --2e-05 -35.3454 Td -(IOART_DELEXINT 5930) 11.438 Tj -21.6719 -35.3454 Td -(IOART_TRGRMOD 5906) 10.836 Tj -2.40798 -36.6545 Td -(5930) 2.408 Tj -24.0799 -36.6545 Td -(5906 6256) 5.418 Tj --2e-05 -37.9636 Td -(IOART_DELFIXED 5923) 11.438 Tj -21.6719 -37.9636 Td -(IOART_VER_MAXREDIR 5936) 13.846 Tj -2.40798 -39.2727 Td -(5923) 2.408 Tj -24.0799 -39.2727 Td -(5936 6244) 5.418 Tj --2e-05 -40.5818 Td -(IOART_DELINIT 5928) 10.836 Tj -21.6719 -40.5818 Td -(IOART_VER_VERSION 5935) 13.244 Tj -2.40798 -41.8909 Td -(5928) 2.408 Tj -24.0799 -41.8909 Td -(5935) 2.408 Tj --2e-05 -43.2 Td -(IOART_DELIVS 5916) 10.234 Tj -21.6719 -43.2 Td -(IO_PIC1 6306) 7.224 Tj -2.40798 -44.5091 Td -(5916) 2.408 Tj -24.0799 -44.5091 Td -(6306 6320 6335 6344) 11.438 Tj --2e-05 -45.8182 Td -(IOART_DELLOPRI 5924) 11.438 Tj -24.0799 -45.8182 Td -(6347 6352 6362 6376) 11.438 Tj -2.40798 -47.1272 Td -(5924) 2.408 Tj -24.0799 -47.1272 Td -(6377) 2.408 Tj --2e-05 -48.4363 Td -(IOART_DELMOD 5922) 10.234 Tj -21.6719 -48.4363 Td -(IO_PIC2 6307) 7.224 Tj -2.40798 -49.7454 Td -(5922 6257) 5.418 Tj -24.0799 -49.7454 Td -(6307 6321 6336 6365) 11.438 Tj --2e-05 -51.0545 Td -(IOART_DELNMI 5927) 10.234 Tj -24.0799 -51.0545 Td -(6366 6367 6370 6379) 11.438 Tj -2.40798 -52.3636 Td -(5927) 2.408 Tj -24.0799 -52.3636 Td -(6380) 2.408 Tj --2e-05 -53.6727 Td -(IOART_DELRSV1 5926) 10.836 Tj -21.6719 -53.6727 Td -(IO_TIMER1 6858) 8.428 Tj -2.40798 -54.9818 Td -(5926) 2.408 Tj -24.0799 -54.9818 Td -(6858 6867 6868 6869) 11.438 Tj --2e-05 -56.2909 Td -(IOART_DELRSV2 5929) 10.836 Tj -24.0799 -56.2909 Td -(6870 6891 6892) 8.428 Tj -2.40798 -57.6 Td -(5929) 2.408 Tj -21.6719 -57.6 Td -(IO_TIMER2 6859) 8.428 Tj --2e-05 -58.9091 Td -(IOART_DELSMI 5925) 10.234 Tj -24.0799 -58.9091 Td -(6859) 2.408 Tj -2.40798 -60.2181 Td -(5925) 2.408 Tj -21.6719 -60.2181 Td -(iput 4432) 5.418 Tj --2e-05 -61.5272 Td -(IOART_DEST 5898) 9.03 Tj -24.0799 -61.5272 Td -(0332 4182 4432 4435) 11.438 Tj -2.40798 -62.8363 Td -(5898 6262 6281) 8.428 Tj -24.0799 -62.8363 Td -(4456 4648 4653 4688) 11.438 Tj --2e-05 -64.1454 Td -(IOART_DESTLOG 5920) 10.836 Tj -24.0799 -64.1454 Td -(4695 4706 4763 4824) 11.438 Tj -2.40798 -65.4545 Td -(5920) 2.408 Tj -24.0799 -65.4545 Td -(4834 4860 4872 4881) 11.438 Tj --2e-05 -66.7636 Td -(IOART_DESTMOD 5918) 10.836 Tj -24.0799 -66.7636 Td -(4882 5267 5273 5282) 11.438 Tj -2.40798 -68.0727 Td -(5918 6258) 5.418 Tj -24.0799 -68.0727 Td -(5287 5291 5335 5368) 11.438 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 6) 25.886 Tj -2.40799 -3.92728 Td -(5384 5385 5414 5419) 11.438 Tj -21.6719 -3.92728 Td -(KBDATAP 6602) 7.224 Tj -2.40799 -5.23637 Td -(5581 5592 5596) 8.428 Tj -24.0799 -5.23637 Td -(6602 6753) 5.418 Tj --1e-05 -6.54546 Td -(irq_enable 6325) 9.03 Tj -21.6719 -6.54546 Td -(KBD_BUF 6735) 7.224 Tj -2.40799 -7.85455 Td -(0252 3759 6325 6842) 11.438 Tj -24.0799 -7.85455 Td -(6735 6736 6794 6796) 11.438 Tj -2.40799 -9.16364 Td -(6893) 2.408 Tj -24.0799 -9.16364 Td -(6824) 2.408 Tj --1e-05 -10.4727 Td -(IRQ_ERROR 2834) 8.428 Tj -21.6719 -10.4727 Td -(kbd_intr 6743) 7.826 Tj -2.40799 -11.7818 Td -(2834 6109) 5.418 Tj -24.0799 -11.7818 Td -(0209 2927 6743) 8.428 Tj --1e-05 -13.0909 Td -(IRQ_IDE 2833) 7.224 Tj -21.6719 -13.0909 Td -(kbd_lock 6739) 7.826 Tj -2.40799 -14.4 Td -(2833 2921 3759 3760) 11.438 Tj -24.0799 -14.4 Td -(6739 6747 6804 6812) 11.438 Tj --1e-05 -15.7091 Td -(IRQ_KBD 2832) 7.224 Tj -24.0799 -15.7091 Td -(6815 6828 6837) 8.428 Tj -2.40799 -17.0182 Td -(2832 2926 6842 6843) 11.438 Tj -21.6719 -17.0182 Td -(kbd_r 6737) 6.02 Tj --1e-05 -18.3273 Td -(IRQ_OFFSET 2829) 9.03 Tj -24.0799 -18.3273 Td -(6737 6794 6798 6814) 11.438 Tj -2.40799 -19.6364 Td -(2829 2905 2921 2926) 11.438 Tj -24.0799 -19.6364 Td -(6815 6818 6819 6823) 11.438 Tj -2.40799 -20.9455 Td -(2931 6073 6099 6109) 11.438 Tj -24.0799 -20.9455 Td -(6824 6825) 5.418 Tj -2.40799 -22.2545 Td -(6259 6347 6366) 8.428 Tj -21.6719 -22.2545 Td -(kbd_w 6738) 6.02 Tj --1e-05 -23.5636 Td -(irq_setmask_8259A 6316) 13.244 Tj -24.0799 -23.5636 Td -(6738 6794 6795 6796) 11.438 Tj -2.40799 -24.8727 Td -(6316 6327 6383) 8.428 Tj -24.0799 -24.8727 Td -(6797 6814 6818) 8.428 Tj --1e-05 -26.1818 Td -(IRQ_SLAVE 6309) 8.428 Tj -21.6719 -26.1818 Td -(KBS_DIB 6601) 7.224 Tj -2.40799 -27.4909 Td -(6309 6313 6352 6367) 11.438 Tj -24.0799 -27.4909 Td -(6601 6751) 5.418 Tj --1e-05 -28.8 Td -(IRQ_SPURIOUS 2835) 10.234 Tj -21.6719 -28.8 Td -(KBSTATP 6600) 7.224 Tj -2.40799 -30.1091 Td -(2835 2931 6099) 8.428 Tj -24.0799 -30.1091 Td -(6600 6750) 5.418 Tj --1e-05 -31.4182 Td -(IRQ_TIMER 2831) 8.428 Tj -21.6719 -31.4182 Td -(KEY_DEL 6626) 7.224 Tj -2.40799 -32.7273 Td -(2831 2905 6073 6893) 11.438 Tj -24.0799 -32.7273 Td -(6626 6674 6701 6725) 11.438 Tj --1e-05 -34.0364 Td -(ismp 1432) 5.418 Tj -21.6719 -34.0364 Td -(KEY_DN 6620) 6.622 Tj -2.40799 -35.3454 Td -(0258 1280 1432 1533) 11.438 Tj -24.0799 -35.3454 Td -(6620 6671 6698 6722) 11.438 Tj -2.40799 -36.6545 Td -(1595 6239 6273) 8.428 Tj -21.6719 -36.6545 Td -(KEY_END 6618) 7.224 Tj --1e-05 -37.9636 Td -(itrunc 4402) 6.622 Tj -24.0799 -37.9636 Td -(6618 6670 6697 6721) 11.438 Tj -2.40799 -39.2727 Td -(0329 4402 4438) 8.428 Tj -21.6719 -39.2727 Td -(KEY_HOME 6617) 7.826 Tj --1e-05 -40.5818 Td -(iunlock 4354) 7.224 Tj -24.0799 -40.5818 Td -(6617 6663 6690 6715) 11.438 Tj -2.40799 -41.8909 Td -(0328 1337 4354 4357) 11.438 Tj -21.6719 -41.8909 Td -(KEY_INS 6625) 7.224 Tj -2.40799 -43.2 Td -(4465 4864 4964 4985) 11.438 Tj -24.0799 -43.2 Td -(6625 6673 6700 6724) 11.438 Tj -2.40799 -44.5091 Td -(5035 5300 5425) 8.428 Tj -21.6719 -44.5091 Td -(KEY_LF 6621) 6.622 Tj --1e-05 -45.8182 Td -(iupdate 4253) 7.224 Tj -24.0799 -45.8182 Td -(6621 6668 6695 6719) 11.438 Tj -2.40799 -47.1272 Td -(0340 4253 4313 4425) 11.438 Tj -21.6719 -47.1272 Td -(KEY_PGDN 6624) 7.826 Tj -2.40799 -48.4363 Td -(4586 4784 4823 4833) 11.438 Tj -24.0799 -48.4363 Td -(6624 6672 6699 6723) 11.438 Tj -2.40799 -49.7454 Td -(4878 5373) 5.418 Tj -21.6719 -49.7454 Td -(KEY_PGUP 6623) 7.826 Tj --1e-05 -51.0545 Td -(jmpbuf 1915) 6.622 Tj -24.0799 -51.0545 Td -(6623 6667 6694 6718) 11.438 Tj -2.40799 -52.3636 Td -(0228 0229 0230 1266) 11.438 Tj -21.6719 -52.3636 Td -(KEY_RT 6622) 6.622 Tj -2.40799 -53.6727 Td -(1267 1914 1915 1940) 11.438 Tj -24.0799 -53.6727 Td -(6622 6669 6696 6720) 11.438 Tj -2.40799 -54.9818 Td -(1964 2145 2146 2147) 11.438 Tj -21.6719 -54.9818 Td -(KEY_UP 6619) 6.622 Tj -2.40799 -56.2909 Td -(2148 2229 2230 2262) 11.438 Tj -24.0799 -56.2909 Td -(6619 6666 6693 6717) 11.438 Tj -2.40799 -57.6 Td -(2263 2500 2501) 8.428 Tj -21.6719 -57.6 Td -(kfree 2605) 6.02 Tj --1e-05 -58.9091 Td -(kalloc 2660) 6.622 Tj -24.0799 -58.9091 Td -(0202 2071 2132 2442) 11.438 Tj -2.40799 -60.2181 Td -(0200 0201 1263 1342) 11.438 Tj -24.0799 -60.2181 Td -(2443 2589 2605 2613) 11.438 Tj -2.40799 -61.5272 Td -(2064 2122 2130 2584) 11.438 Tj -24.0799 -61.5272 Td -(5563 5591 5648 5676) 11.438 Tj -2.40799 -62.8363 Td -(2602 2660 2665 2686) 11.438 Tj -21.6719 -62.8363 Td -(kinit 2578) 6.02 Tj -2.40799 -64.1454 Td -(5515 5630) 5.418 Tj -24.0799 -64.1454 Td -(0203 1254 2578 2603) 11.438 Tj --1e-05 -65.4545 Td -(kalloc_lock 2565) 9.632 Tj -21.6719 -65.4545 Td -(KSTACKSIZE 0152) 9.03 Tj -2.40799 -66.7636 Td -(2565 2584 2619 2653) 11.438 Tj -24.0799 -66.7636 Td -(0152 1263 1267 2034) 11.438 Tj -2.40799 -68.0727 Td -(2667 2674 2680 2685) 11.438 Tj -24.0799 -68.0727 Td -(2130 2139 2443) 8.428 Tj +/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 @@ -2462,6 +2604,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -2469,437 +2614,449 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 7) 25.886 Tj -0 -3.92728 Td -(lapic_disableintr 6129) 13.244 Tj -24.0799 -3.92728 Td -(0239 1387 1612 2067) 11.438 Tj -2.408 -5.23637 Td -(0270 6129) 5.418 Tj -24.0799 -5.23637 Td -(2127 2140 4230 4265) 11.438 Tj -0 -6.54546 Td -(lapic_enableintr 6122) 12.642 Tj -24.0799 -6.54546 Td -(4498 4573 5555 5780) 11.438 Tj -2.408 -7.85455 Td -(0269 1286 1310 6122) 11.438 Tj -24.0799 -7.85455 Td -(6461) 2.408 Tj -0 -9.16364 Td -(lapic_eoi 6136) 8.428 Tj -21.6719 -9.16364 Td -(memset 5754) 6.622 Tj -2.408 -10.4727 Td -(0271 2923 2928 6136) 11.438 Tj -24.0799 -10.4727 Td -(0237 1229 1348 1388) 11.438 Tj -7.10543e-15 -11.7818 Td -(lapic_init 6086) 9.03 Tj -24.0799 -11.7818 Td -(2068 2146 4166 4300) 11.438 Tj -2.408 -13.0909 Td -(0265 1242 1308 6086) 11.438 Tj -24.0799 -13.0909 Td -(4819 5375 5518 5578) 11.438 Tj -7.10543e-15 -14.4 Td -(lapic_read 6053) 9.03 Tj -24.0799 -14.4 Td -(5754 6463) 5.418 Tj -2.408 -15.7091 Td -(6053 6094 6106 6111) 11.438 Tj -21.6719 -15.7091 Td -(mknod 4753) 6.02 Tj -2.408 -17.0182 Td -(6117 6155) 5.418 Tj -24.0799 -17.0182 Td -(0337 1666 4753 5333) 11.438 Tj -7.10543e-15 -18.3273 Td -(lapic_startap 6162) 10.836 Tj -21.6719 -18.3273 Td -(mknod1 4772) 6.622 Tj -2.408 -19.6364 Td -(0266 1627 6162) 8.428 Tj -24.0799 -19.6364 Td -(0338 4761 4772 5266) 11.438 Tj -1.42109e-14 -20.9455 Td -(lapic_timerinit 6066) 12.04 Tj -24.0799 -20.9455 Td -(5366) 2.408 Tj -2.408 -22.2545 Td -(0267 1281 1309 6066) 11.438 Tj -21.6719 -22.2545 Td -(mp 0852) 4.214 Tj -7.10543e-15 -23.5636 Td -(lapic_timerintr 6079) 12.04 Tj -24.0799 -23.5636 Td -(0257 0852 1111 1112) 11.438 Tj -2.408 -24.8727 Td -(0268 2906 6079) 8.428 Tj -24.0799 -24.8727 Td -(1401 1437 1439 1446) 11.438 Tj -7.10543e-15 -26.1818 Td -(lapic_write 6059) 9.632 Tj -24.0799 -26.1818 Td -(1450 1453 1463 1468) 11.438 Tj -2.408 -27.4909 Td -(6059 6071 6072 6074) 11.438 Tj -24.0799 -27.4909 Td -(1472 1473 1477 1478) 11.438 Tj -2.408 -28.8 Td -(6075 6082 6093 6095) 11.438 Tj -24.0799 -28.8 Td -(1495 1500 1539 1582) 11.438 Tj -2.408 -30.1091 Td -(6096 6099 6101 6102) 11.438 Tj -24.0799 -30.1091 Td -(5951 6201) 5.418 Tj -2.408 -31.4182 Td -(6104 6108 6109 6110) 11.438 Tj -21.6719 -31.4182 Td -(mp_bcpu 1593) 7.224 Tj -2.408 -32.7273 Td -(6114 6115 6125 6132) 11.438 Tj -24.0799 -32.7273 Td -(0261 1236 1593) 8.428 Tj -2.408 -34.0364 Td -(6139 6168 6169 6173) 11.438 Tj -21.6719 -34.0364 Td -(mpbe 0888) 5.418 Tj -2.408 -35.3454 Td -(6180 6181) 5.418 Tj -24.0799 -35.3454 Td -(0888 1522 1556 1561) 11.438 Tj -7.10543e-15 -36.6545 Td -(lgdt 0403) 5.418 Tj -21.6719 -36.6545 Td -(mpctb 0863) 6.02 Tj -2.408 -37.9636 Td -(0403 0411 1068 1144) 11.438 Tj -24.0799 -37.9636 Td -(0863 1491 1500 1520) 11.438 Tj -2.408 -39.2727 Td -(2052) 2.408 Tj -24.0799 -39.2727 Td -(1539 1540 1541 1542) 11.438 Tj -1.42109e-14 -40.5818 Td -(lidt 0417) 5.418 Tj -21.6719 -40.5818 Td -(mp_detect 1489) 8.428 Tj -2.408 -41.8909 Td -(0417 0425 2876) 8.428 Tj -24.0799 -41.8909 Td -(1489 1529) 5.418 Tj -2.13163e-14 -43.2 Td -(link 4852) 5.418 Tj -21.6719 -43.2 Td -(mpie 0908) 5.418 Tj -2.408 -44.5091 Td -(0341 0688 4850 4852) 11.438 Tj -24.0799 -44.5091 Td -(0908 1524 1569 1570) 11.438 Tj -2.408 -45.8182 Td -(5471) 2.408 Tj -21.6719 -45.8182 Td -(mp_init 1516) 7.224 Tj -2.13163e-14 -47.1272 Td -(load_icode 1364) 9.03 Tj -24.0799 -47.1272 Td -(0259 1235 1516 1573) 11.438 Tj -2.408 -48.4363 Td -(0288 1356 1364 1372) 11.438 Tj -21.6719 -48.4363 Td -(mpioapic 0900) 7.826 Tj -2.408 -49.7454 Td -(1382 1384) 5.418 Tj -24.0799 -49.7454 Td -(0900 1523 1564 1566) 11.438 Tj -2.13163e-14 -51.0545 Td -(lpt_putc 6417) 7.826 Tj -21.6719 -51.0545 Td -(mpmain 1302) 6.622 Tj -2.408 -52.3636 Td -(6417 6441) 5.418 Tj -24.0799 -52.3636 Td -(1302 1307 1600 1624) 11.438 Tj -2.84217e-14 -53.6727 Td -(ltr 0429) 4.816 Tj -21.6719 -53.6727 Td -(mppe 0878) 5.418 Tj -2.408 -54.9818 Td -(0429 0431 2053) 8.428 Tj -24.0799 -54.9818 Td -(0878 1521 1547 1553) 11.438 Tj -3.55271e-14 -56.2909 Td -(main0 1222) 6.02 Tj -21.6719 -56.2909 Td -(mp_scan 1440) 7.224 Tj -2.408 -57.6 Td -(1218 1222) 5.418 Tj -24.0799 -57.6 Td -(1440 1472 1477 1480) 11.438 Tj -4.26326e-14 -58.9091 Td -(MAXLVTSHIFT 5865) 9.632 Tj -21.6719 -58.9091 Td -(mp_search 1464) 8.428 Tj -2.408 -60.2181 Td -(5865) 2.408 Tj -24.0799 -60.2181 Td -(1464 1495) 5.418 Tj -4.9738e-14 -61.5272 Td -(MAXREDIRSHIFT 5937) 10.836 Tj -21.6719 -61.5272 Td -(MPSTACK 1959) 7.224 Tj -2.408 -62.8363 Td -(5937 6244) 5.418 Tj -24.0799 -62.8363 Td -(1239 1240 1621 1959) 11.438 Tj -5.68434e-14 -64.1454 Td -(memcmp 5765) 6.622 Tj -24.0799 -64.1454 Td -(1967) 2.408 Tj -2.408 -65.4545 Td -(0238 1447 1501 4670) 11.438 Tj -21.6719 -65.4545 Td -(mp_startthem 1606) 10.234 Tj -2.408 -66.7636 Td -(5765) 2.408 Tj -24.0799 -66.7636 Td -(0260 1277 1606) 8.428 Tj -5.68434e-14 -68.0727 Td -(memmove 5780) 7.224 Tj -21.6719 -68.0727 Td -(namei 4610) 6.02 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 8) 25.886 Tj -2.40799 -3.92728 Td -(0333 4610 4709 4758) 11.438 Tj -21.6719 -3.92728 Td -(O_RDWR 3403) 6.622 Tj -2.40799 -5.23637 Td -(4808 4857 4866 5264) 11.438 Tj -24.0799 -5.23637 Td -(1665 1667 3403 5281) 11.438 Tj -2.40799 -6.54546 Td -(5277 5362 5410 5490) 11.438 Tj -24.0799 -6.54546 Td -(5302) 2.408 Tj --1e-05 -7.85455 Td -(NAMEI_CREATE 3669) 10.234 Tj -21.6719 -7.85455 Td -(outb 0371) 5.418 Tj -2.40799 -9.16364 Td -(3669 4602 4644 4686) 11.438 Tj -24.0799 -9.16364 Td -(0371 0373 1047 1055) 11.438 Tj -2.40799 -10.4727 Td -(4758 4866 5264 5362) 11.438 Tj -24.0799 -10.4727 Td -(1584 1587 3775 3782) 11.438 Tj --1e-05 -11.7818 Td -(NAMEI_DELETE 3670) 10.234 Tj -24.0799 -11.7818 Td -(3809 3810 3811 3812) 11.438 Tj -2.40799 -13.0909 Td -(3670 4607 4701 4808) 11.438 Tj -24.0799 -13.0909 Td -(3813 3814 3816 3818) 11.438 Tj --1e-05 -14.4 Td -(NAMEI_LOOKUP 3668) 10.234 Tj -24.0799 -14.4 Td -(3881 3882 3883 3884) 11.438 Tj -2.40799 -15.7091 Td -(3668 4601 4642 4857) 11.438 Tj -24.0799 -15.7091 Td -(3885 3886 6320 6321) 11.438 Tj -2.40799 -17.0182 Td -(5277 5410 5490) 8.428 Tj -24.0799 -17.0182 Td -(6335 6336 6344 6347) 11.438 Tj --1e-05 -18.3273 Td -(NBUF 0157) 5.418 Tj -24.0799 -18.3273 Td -(6352 6362 6365 6366) 11.438 Tj -2.40799 -19.6364 Td -(0157 3935 3953) 8.428 Tj -24.0799 -19.6364 Td -(6367 6370 6376 6377) 11.438 Tj --1e-05 -20.9455 Td -(NCPU 0153) 5.418 Tj -24.0799 -20.9455 Td -(6379 6380 6423 6424) 11.438 Tj -2.40799 -22.2545 Td -(0153 1232 1431 1957) 11.438 Tj -24.0799 -22.2545 Td -(6425 6444 6446 6466) 11.438 Tj -2.40799 -23.5636 Td -(1972 2012) 5.418 Tj -24.0799 -23.5636 Td -(6467 6468 6469 6890) 11.438 Tj --1e-05 -24.8727 Td -(NDEV 0159) 5.418 Tj -24.0799 -24.8727 Td -(6891 6892) 5.418 Tj -2.40799 -26.1818 Td -(0159 4489 4555 4914) 11.438 Tj -21.6719 -26.1818 Td -(outsl 0383) 6.02 Tj --1e-05 -27.4909 Td -(NDIRECT 3567) 7.224 Tj -24.0799 -27.4909 Td -(0383 3819 3891) 8.428 Tj -2.40799 -28.8 Td -(3566 3567 3570 4377) 11.438 Tj -21.6719 -28.8 Td -(outw 0377) 5.418 Tj -2.40799 -30.1091 Td -(4386 4516 4532 4536) 11.438 Tj -24.0799 -30.1091 Td -(0377 0379) 5.418 Tj --1e-05 -31.4182 Td -(newblock 4510) 7.826 Tj -21.6719 -31.4182 Td -(O_WRONLY 3402) 7.826 Tj -2.40799 -32.7273 Td -(4510 4567 4568) 8.428 Tj -24.0799 -32.7273 Td -(3402 5281 5305) 8.428 Tj --1e-05 -34.0364 Td -(NFILE 0155) 6.02 Tj -21.6719 -34.0364 Td -(PAGE 0151) 5.418 Tj -2.40799 -35.3454 Td -(0155 4916 4931) 8.428 Tj -24.0799 -35.3454 Td -(0151 0152 1341 2586) 11.438 Tj --1e-05 -36.6545 Td -(NINODE 0158) 6.622 Tj -24.0799 -36.6545 Td -(2588 2589 2612 2664) 11.438 Tj -2.40799 -37.9636 Td -(0158 4078 4194) 8.428 Tj -24.0799 -37.9636 Td -(5630 5648 5676) 8.428 Tj --1e-05 -39.2727 Td -(NO 6604) 4.214 Tj -21.6719 -39.2727 Td -(panic 6555) 6.02 Tj -2.40799 -40.5818 Td -(6604 6652 6655 6657) 11.438 Tj -24.0799 -40.5818 Td -(0208 1307 1360 1372) 11.438 Tj -2.40799 -41.8909 Td -(6658 6659 6660 6662) 11.438 Tj -24.0799 -41.8909 Td -(1382 1384 1808 1834) 11.438 Tj -2.40799 -43.2 Td -(6679 6682 6684 6685) 11.438 Tj -24.0799 -43.2 Td -(2258 2260 2308 2311) 11.438 Tj -2.40799 -44.5091 Td -(6686 6687 6689 6708) 11.438 Tj -24.0799 -44.5091 Td -(2419 2613 2625 2665) 11.438 Tj -2.40799 -45.8182 Td -(6709 6711 6712 6713) 11.438 Tj -24.0799 -45.8182 Td -(2945 3831 3877 3996) 11.438 Tj -2.40799 -47.1272 Td -(6714) 2.408 Tj -24.0799 -47.1272 Td -(4022 4033 4129 4214) 11.438 Tj --1e-05 -48.4363 Td -(NOFILE 0154) 6.622 Tj -24.0799 -48.4363 Td -(4297 4325 4357 4376) 11.438 Tj -2.40799 -49.7454 Td -(0154 1938 2151 2394) 11.438 Tj -24.0799 -49.7454 Td -(4380 4383 4389 4435) 11.438 Tj -2.40799 -51.0545 Td -(5128 5157) 5.418 Tj -24.0799 -51.0545 Td -(4590 4709 4724 4736) 11.438 Tj --1e-05 -52.3636 Td -(NPROC 0150) 6.02 Tj -24.0799 -52.3636 Td -(4815 4821 4829 4967) 11.438 Tj -2.40799 -53.6727 Td -(0150 2011 2085 2217) 11.438 Tj -24.0799 -53.6727 Td -(4988 5007 5021 5056) 11.438 Tj -2.40799 -54.9818 Td -(2346 2369 2406 2411) 11.438 Tj -24.0799 -54.9818 Td -(6555 6562) 5.418 Tj -2.40799 -56.2909 Td -(2435 2475) 5.418 Tj -21.6719 -56.2909 Td -(pic_init 6332) 7.826 Tj --1e-05 -57.6 Td -(NREQUEST 0156) 7.826 Tj -24.0799 -57.6 Td -(0251 1252 6332) 8.428 Tj -2.40799 -58.9091 Td -(0156 3733 3836 3845) 11.438 Tj -21.6719 -58.9091 Td -(pinit 2018) 6.02 Tj -2.40799 -60.2181 Td -(3860 3862) 5.418 Tj -24.0799 -60.2181 Td -(0212 1250 2018) 8.428 Tj --1e-05 -61.5272 Td -(NSEGS 1906) 6.02 Tj -21.6719 -61.5272 Td -(pipe 5611) 5.418 Tj -2.40799 -62.8363 Td -(1906 1966) 5.418 Tj -24.0799 -62.8363 Td -(0290 0291 0294 0295) 11.438 Tj --1e-05 -64.1454 Td -(O_CREATE 3400) 7.826 Tj -24.0799 -64.1454 Td -(0296 3505 4957 4979) 11.438 Tj -2.40799 -65.4545 Td -(3400 5263) 5.418 Tj -24.0799 -65.4545 Td -(5017 5611 5624 5630) 11.438 Tj --1e-05 -66.7636 Td -(O_RDONLY 3401) 7.826 Tj -24.0799 -66.7636 Td -(5636 5640 5644 5661) 11.438 Tj -2.40799 -68.0727 Td -(3401) 2.408 Tj -24.0799 -68.0727 Td -(5680 5706) 5.418 Tj +/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 @@ -2910,7 +3067,10 @@ pdfEndPage %%Page: 6 6 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -2918,437 +3078,449 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 9) 25.886 Tj -0 -3.92728 Td -(pipe_alloc 5621) 9.03 Tj -24.0799 -3.92728 Td -(2223 2239 2250 2257) 11.438 Tj -2.408 -5.23637 Td -(0293 5176 5621) 8.428 Tj -24.0799 -5.23637 Td -(2272 2275 2283 2284) 11.438 Tj -0 -6.54546 Td -(pipe_close 5661) 9.03 Tj -24.0799 -6.54546 Td -(2313 2315 2317 2319) 11.438 Tj -2.408 -7.85455 Td -(0294 5017 5661) 8.428 Tj -24.0799 -7.85455 Td -(2320 2333 2334 2355) 11.438 Tj -0 -9.16364 Td -(pipe_read 5706) 8.428 Tj -24.0799 -9.16364 Td -(2357 2368 2375 2379) 11.438 Tj -2.408 -10.4727 Td -(0296 4979 5706) 8.428 Tj -24.0799 -10.4727 Td -(2403 2431 2448 2457) 11.438 Tj -0 -11.7818 Td -(PIPESIZE 5609) 7.826 Tj -24.0799 -11.7818 Td -(2462) 2.408 Tj -2.408 -13.0909 Td -(5609 5617 5687 5696) 11.438 Tj -21.6719 -13.0909 Td -(proc_wait 2425) 8.428 Tj -2.408 -14.4 Td -(5724) 2.408 Tj -24.0799 -14.4 Td -(0223 1359 2425 3238) 11.438 Tj -0 -15.7091 Td -(pipe_write 5680) 9.03 Tj -21.6719 -15.7091 Td -(proghdr 0824) 7.224 Tj -2.408 -17.0182 Td -(0295 4957 5680) 8.428 Tj -24.0799 -17.0182 Td -(0824 1368 1377 1382) 11.438 Tj -7.10543e-15 -18.3273 Td -(pit8253_timerinit 6887) 13.244 Tj -24.0799 -18.3273 Td -(5482) 2.408 Tj -2.408 -19.6364 Td -(0255 1283 6887) 8.428 Tj -21.6719 -19.6364 Td -(read_eflags 0435) 9.632 Tj -0 -20.9455 Td -(printint 6473) 7.826 Tj -24.0799 -20.9455 Td -(0435) 2.408 Tj -2.408 -22.2545 Td -(6473 6522 6525) 8.428 Tj -21.6719 -22.2545 Td -(readi 4483) 6.02 Tj --7.10543e-15 -23.5636 Td -(proc 1929) 5.418 Tj -24.0799 -23.5636 Td -(0335 4483 4723 4814) 11.438 Tj -2.408 -24.8727 Td -(0211 0213 0214 0215) 11.438 Tj -24.0799 -24.8727 Td -(4982 5494 5502 5569) 11.438 Tj -2.408 -26.1818 Td -(0244 0245 0288 1203) 11.438 Tj -24.0799 -26.1818 Td -(5576) 2.408 Tj -2.408 -27.4909 Td -(1226 1261 1265 1325) 11.438 Tj -21.6719 -27.4909 Td -(release 1831) 7.224 Tj -2.408 -28.8 Td -(1329 1330 1364 1407) 11.438 Tj -24.0799 -28.8 Td -(0283 1231 1334 1831) 11.438 Tj -2.408 -30.1091 Td -(1521 1547 1548 1549) 11.438 Tj -24.0799 -30.1091 Td -(1834 2113 2118 2223) 11.438 Tj -2.408 -31.4182 Td -(1757 1900 1929 1956) 11.438 Tj -24.0799 -31.4182 Td -(2239 2275 2284 2300) 11.438 Tj -2.408 -32.7273 Td -(1957 2005 2011 2012) 11.438 Tj -24.0799 -32.7273 Td -(2318 2321 2334 2357) 11.438 Tj -2.408 -34.0364 Td -(2028 2061 2076 2079) 11.438 Tj -24.0799 -34.0364 Td -(2375 2379 2448 2457) 11.438 Tj -2.408 -35.3454 Td -(2083 2086 2104 2105) 11.438 Tj -24.0799 -35.3454 Td -(2653 2674 2680 2685) 11.438 Tj -2.408 -36.6545 Td -(2108 2210 2218 2255) 11.438 Tj -24.0799 -36.6545 Td -(3793 3867 3920 3983) 11.438 Tj -2.408 -37.9636 Td -(2270 2305 2344 2346) 11.438 Tj -24.0799 -37.9636 Td -(3992 4047 4206 4221) 11.438 Tj -2.408 -39.2727 Td -(2366 2369 2389 2390) 11.438 Tj -24.0799 -39.2727 Td -(4333 4364 4448 4935) 11.438 Tj -2.408 -40.5818 Td -(2406 2411 2427 2428) 11.438 Tj -24.0799 -40.5818 Td -(4939 5014 5024 5058) 11.438 Tj -2.408 -41.8909 Td -(2436 2473 2476 2562) 11.438 Tj -24.0799 -41.8909 Td -(5673 5689 5700 5714) 11.438 Tj -2.408 -43.2 Td -(2853 2883 2938 3004) 11.438 Tj -24.0799 -43.2 Td -(5727 6551 6584 6804) 11.438 Tj -2.408 -44.5091 Td -(3025 3037 3054 3066) 11.438 Tj -24.0799 -44.5091 Td -(6828) 2.408 Tj -2.408 -45.8182 Td -(3123 3204 3220 3261) 11.438 Tj -21.6719 -45.8182 Td -(run 2567) 4.816 Tj -2.408 -47.1272 Td -(3705 3930 4055 4614) 11.438 Tj -24.0799 -47.1272 Td -(1583 1940 2103 2203) 11.438 Tj -2.408 -48.4363 Td -(4905 5104 5124 5156) 11.438 Tj -24.0799 -48.4363 Td -(2214 2567 2568 2571) 11.438 Tj -2.408 -49.7454 Td -(5172 5403 5477 5604) 11.438 Tj -24.0799 -49.7454 Td -(2607 2608 2609 2623) 11.438 Tj -2.408 -51.0545 Td -(5957) 2.408 Tj -24.0799 -51.0545 Td -(2662 2671 2915) 8.428 Tj --7.10543e-15 -52.3636 Td -(procdump 2470) 7.826 Tj -21.6719 -52.3636 Td -(RUNNING 1926) 7.224 Tj -2.408 -53.6727 Td -(0225 2470 6790) 8.428 Tj -24.0799 -53.6727 Td -(1926 2228 2916) 8.428 Tj -0 -54.9818 Td -(process0 1327) 7.826 Tj -21.6719 -54.9818 Td -(sched 2253) 6.02 Tj -2.408 -56.2909 Td -(1215 1265 1266 1327) 11.438 Tj -24.0799 -56.2909 Td -(2253 2258 2260 2274) 11.438 Tj -7.10543e-15 -57.6 Td -(proc_exit 2387) 8.428 Tj -24.0799 -57.6 Td -(2314 2327 2418) 8.428 Tj -2.408 -58.9091 Td -(0221 2387 2461 2887) 11.438 Tj -21.6719 -58.9091 Td -(scheduler 2208) 8.428 Tj -2.408 -60.2181 Td -(2891 2913 2940 3231) 11.438 Tj -24.0799 -60.2181 Td -(0220 1292 1322 1325) 11.438 Tj -2.408 -61.5272 Td -(5597) 2.408 Tj -24.0799 -61.5272 Td -(1964 2025 2200 2201) 11.438 Tj -7.10543e-15 -62.8363 Td -(proc_kill 2364) 8.428 Tj -24.0799 -62.8363 Td -(2206 2208 2250 2278) 11.438 Tj -2.408 -64.1454 Td -(0222 2364 3248) 8.428 Tj -24.0799 -64.1454 Td -(2283 2415) 5.418 Tj -7.10543e-15 -65.4545 Td -(proc_table_lock 2009) 12.04 Tj -21.6719 -65.4545 Td -(segdesc 0627) 7.224 Tj -2.408 -66.7636 Td -(1331 1334 2009 2020) 11.438 Tj -24.0799 -66.7636 Td -(0400 0403 0627 0651) 11.438 Tj -2.408 -68.0727 Td -(2111 2113 2118 2215) 11.438 Tj -24.0799 -68.0727 Td -(0654 0659 1966) 8.428 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 10) 26.488 Tj -0 -3.92728 Td -(SEG_KCODE 1901) 8.428 Tj -21.6719 -3.92728 Td -(stati 4470) 6.02 Tj -2.408 -5.23637 Td -(1901 2040 2869 2870) 11.438 Tj -24.0799 -5.23637 Td -(0334 4470 5034) 8.428 Tj -7.10543e-15 -6.54546 Td -(SEG_KDATA 1902) 8.428 Tj -21.6719 -6.54546 Td -(STA_W 0566 0668) 9.03 Tj -2.408 -7.85455 Td -(1902 2032 2041 2760) 11.438 Tj -24.0799 -7.85455 Td -(0566 0668 1096 1174) 11.438 Tj -1.42109e-14 -9.16364 Td -(SEG_NULLASM 0554) 9.632 Tj -24.0799 -9.16364 Td -(2041 2046) 5.418 Tj -2.408 -10.4727 Td -(0554 1094 1172) 8.428 Tj -21.6719 -10.4727 Td -(STA_X 0563 0665) 9.03 Tj -7.10543e-15 -11.7818 Td -(SEG_TSS 1905) 7.224 Tj -24.0799 -11.7818 Td -(0563 0665 1095 1173) 11.438 Tj -2.408 -13.0909 Td -(1905 2042 2043 2053) 11.438 Tj -24.0799 -13.0909 Td -(2040 2045) 5.418 Tj -7.10543e-15 -14.4 Td -(SEG_UCODE 1903) 8.428 Tj -21.6719 -14.4 Td -(sti 0485) 4.816 Tj -2.408 -15.7091 Td -(1350 1903 2045 2048) 11.438 Tj -24.0799 -15.7091 Td -(0485 0487 1290 1320) 11.438 Tj -1.42109e-14 -17.0182 Td -(SEG_UDATA 1904) 8.428 Tj -24.0799 -17.0182 Td -(1845) 2.408 Tj -2.408 -18.3273 Td -(1349 1904 2046 2049) 11.438 Tj -21.6719 -18.3273 Td -(strncmp 5801) 7.224 Tj -7.10543e-15 -19.6364 Td -(setupsegs 2028) 8.428 Tj -24.0799 -19.6364 Td -(0240 1558 5801) 8.428 Tj -2.408 -20.9455 Td -(0214 1270 1313 2028) 11.438 Tj -21.6719 -20.9455 Td -(STS_CG16 0676) 7.826 Tj -2.408 -22.2545 Td -(2226 2236 3267 5585) 11.438 Tj -24.0799 -22.2545 Td -(0676) 2.408 Tj -7.10543e-15 -23.5636 Td -(shift 6740) 6.02 Tj -21.6719 -23.5636 Td -(STS_CG32 0682) 7.826 Tj -2.408 -24.8727 Td -(6740 6756 6760 6761) 11.438 Tj -24.0799 -24.8727 Td -(0682) 2.408 Tj -2.408 -26.1818 Td -(6763 6766 6769 6770) 11.438 Tj -21.6719 -26.1818 Td -(STS_IG16 0678) 7.826 Tj -2.408 -27.4909 Td -(6772 6773) 5.418 Tj -24.0799 -27.4909 Td -(0678) 2.408 Tj -1.42109e-14 -28.8 Td -(sleep 2303) 6.02 Tj -21.6719 -28.8 Td -(STS_IG32 0683) 7.826 Tj -2.408 -30.1091 Td -(0218 1803 2300 2303) 11.438 Tj -24.0799 -30.1091 Td -(0683 0764) 5.418 Tj -2.408 -31.4182 Td -(2308 2311 2324 2372) 11.438 Tj -21.6719 -31.4182 Td -(STS_LDT 0674) 7.224 Tj -2.408 -32.7273 Td -(2462 3837 3851 3907) 11.438 Tj -24.0799 -32.7273 Td -(0674) 2.408 Tj -2.408 -34.0364 Td -(3979 4076 4197 4330) 11.438 Tj -21.6719 -34.0364 Td -(STS_T16A 0673) 7.826 Tj -2.408 -35.3454 Td -(5693 5717 6815) 8.428 Tj -24.0799 -35.3454 Td -(0673) 2.408 Tj -2.13163e-14 -36.6545 Td -(spinlock 1701) 7.826 Tj -21.6719 -36.6545 Td -(STS_T16B 0675) 7.826 Tj -2.408 -37.9636 Td -(0216 0218 0279 0280) 11.438 Tj -24.0799 -37.9636 Td -(0675) 2.408 Tj -2.408 -39.2727 Td -(0281 0282 0283 0284) 11.438 Tj -21.6719 -39.2727 Td -(STS_T32A 0680) 7.826 Tj -2.408 -40.5818 Td -(1210 1331 1701 1758) 11.438 Tj -24.0799 -40.5818 Td -(0680 2042) 5.418 Tj -2.408 -41.8909 Td -(1763 1805 1831 1852) 11.438 Tj -21.6719 -41.8909 Td -(STS_T32B 0681) 7.826 Tj -2.408 -43.2 Td -(2007 2009 2303 2563) 11.438 Tj -24.0799 -43.2 Td -(0681) 2.408 Tj -2.408 -44.5091 Td -(2565 3009 3209 3709) 11.438 Tj -21.6719 -44.5091 Td -(STS_TG 0677) 6.622 Tj -2.408 -45.8182 Td -(3735 3932 3936 4057) 11.438 Tj -24.0799 -45.8182 Td -(0677) 2.408 Tj -2.408 -47.1272 Td -(4079 4908 4913 5109) 11.438 Tj -21.6719 -47.1272 Td -(STS_TG16 0679) 7.826 Tj -2.408 -48.4363 Td -(5607 5616 6404 6409) 11.438 Tj -24.0799 -48.4363 Td -(0679) 2.408 Tj -2.408 -49.7454 Td -(6739) 2.408 Tj -21.6719 -49.7454 Td -(STS_TG32 0684) 7.826 Tj -2.13163e-14 -51.0545 Td -(STA_A 0568 0670) 9.03 Tj -24.0799 -51.0545 Td -(0684 0764) 5.418 Tj -2.408 -52.3636 Td -(0568 0670) 5.418 Tj -21.6719 -52.3636 Td -(superblock 3560) 9.03 Tj -1.42109e-14 -53.6727 Td -(STA_C 0565 0667) 9.03 Tj -24.0799 -53.6727 Td -(3560 4106 4113 4155) 11.438 Tj -2.408 -54.9818 Td -(0565 0667) 5.418 Tj -24.0799 -54.9818 Td -(4161 4277 4283) 8.428 Tj -1.42109e-14 -56.2909 Td -(STA_E 0564 0666) 9.03 Tj -21.6719 -56.2909 Td -(syscall 3121) 7.224 Tj -2.408 -57.6 Td -(0564 0666) 5.418 Tj -24.0799 -57.6 Td -(0242 0243 1207 2857) 11.438 Tj -2.13163e-14 -58.9091 Td -(STA_R 0567 0669) 9.03 Tj -24.0799 -58.9091 Td -(2889 3008 3121 3208) 11.438 Tj -2.408 -60.2181 Td -(0567 0669 1095 1173) 11.438 Tj -24.0799 -60.2181 Td -(5108) 2.408 Tj -2.408 -61.5272 Td -(2040 2045) 5.418 Tj -21.6719 -61.5272 Td -(SYS_chdir 2716) 8.428 Tj -1.42109e-14 -62.8363 Td -(stat 3450) 5.418 Tj -24.0799 -62.8363 Td -(2716 3173) 5.418 Tj -2.408 -64.1454 Td -(0301 0307 0334 1651) 11.438 Tj -21.6719 -64.1454 Td -(SYS_close 2707) 8.428 Tj -2.408 -65.4545 Td -(3001 3201 3450 4051) 11.438 Tj -24.0799 -65.4545 Td -(2707 3146) 5.418 Tj -2.408 -66.7636 Td -(4468 4470 4901 5030) 11.438 Tj -21.6719 -66.7636 Td -(SYS_dup 2717) 7.224 Tj -2.408 -68.0727 Td -(5101 5443) 5.418 Tj -24.0799 -68.0727 Td -(2717 3176) 5.418 Tj +/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 @@ -3360,6 +3532,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -3367,337 +3542,263 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 11) 26.488 Tj -0 -3.92728 Td -(SYS_exec 2709) 7.826 Tj -21.6719 -3.92728 Td -(T_DEV 3584) 6.02 Tj -2.408 -5.23637 Td -(2709 3152) 5.418 Tj -24.0799 -5.23637 Td -(1666 3575 3576 3584) 11.438 Tj -7.10543e-15 -6.54546 Td -(SYS_exit 2702) 7.826 Tj -24.0799 -6.54546 Td -(4488 4554) 5.418 Tj -2.408 -7.85455 Td -(2702 3131) 5.418 Tj -21.6719 -7.85455 Td -(T_DEVICE 2810) 7.826 Tj -0 -9.16364 Td -(SYS_fork 2701) 7.826 Tj -24.0799 -9.16364 Td -(2810) 2.408 Tj -2.408 -10.4727 Td -(2701 3128) 5.418 Tj -21.6719 -10.4727 Td -(T_DIR 3582) 6.02 Tj --7.10543e-15 -11.7818 Td -(SYS_fstat 2713) 8.428 Tj -24.0799 -11.7818 Td -(3582 4558 4581 4652) 11.438 Tj -2.408 -13.0909 Td -(2713 3164) 5.418 Tj -24.0799 -13.0909 Td -(4859 5272 5281 5366) 11.438 Tj --7.10543e-15 -14.4 Td -(SYS_getpid 2718) 9.03 Tj -24.0799 -14.4 Td -(5418) 2.408 Tj -2.408 -15.7091 Td -(2718 3179) 5.418 Tj -21.6719 -15.7091 Td -(T_DIVIDE 2803) 7.826 Tj --1.42109e-14 -17.0182 Td -(SYS_kill 2708) 7.826 Tj -24.0799 -17.0182 Td -(2803) 2.408 Tj -2.408 -18.3273 Td -(2708 3149) 5.418 Tj -21.6719 -18.3273 Td -(T_FILE 3583) 6.622 Tj --2.13163e-14 -19.6364 Td -(SYS_link 2714) 7.826 Tj -24.0799 -19.6364 Td -(3583 4558 5266) 8.428 Tj -2.408 -20.9455 Td -(2714 3167) 5.418 Tj -21.6719 -20.9455 Td -(T_FPERR 2819) 7.224 Tj --2.84217e-14 -22.2545 Td -(SYS_mkdir 2715) 8.428 Tj -24.0799 -22.2545 Td -(2819) 2.408 Tj -2.408 -23.5636 Td -(2715 3170) 5.418 Tj -21.6719 -23.5636 Td -(T_GPFLT 2816) 7.224 Tj --3.55271e-14 -24.8727 Td -(SYS_mknod 2711) 8.428 Tj -24.0799 -24.8727 Td -(2816) 2.408 Tj -2.408 -26.1818 Td -(2711 3158) 5.418 Tj -21.6719 -26.1818 Td -(T_ILLOP 2809) 7.224 Tj --4.26326e-14 -27.4909 Td -(SYS_open 2710) 7.826 Tj -24.0799 -27.4909 Td -(2809) 2.408 Tj -2.408 -28.8 Td -(2710 3155) 5.418 Tj -21.6719 -28.8 Td -(TIMER_16BIT 6883) 9.632 Tj --4.9738e-14 -30.1091 Td -(SYS_pipe 2704) 7.826 Tj -24.0799 -30.1091 Td -(6883 6890) 5.418 Tj -2.408 -31.4182 Td -(2704 3137) 5.418 Tj -21.6719 -31.4182 Td -(TIMER_BCD 6884) 8.428 Tj --5.68434e-14 -32.7273 Td -(SYS_read 2706) 7.826 Tj -24.0799 -32.7273 Td -(6884) 2.408 Tj -2.408 -34.0364 Td -(2706 3143) 5.418 Tj -21.6719 -34.0364 Td -(TIMER_FREQ 6864) 9.03 Tj --6.39488e-14 -35.3454 Td -(SYS_sbrk 2719) 7.826 Tj -24.0799 -35.3454 Td -(6861 6864 6865) 8.428 Tj -2.408 -36.6545 Td -(2719 3182) 5.418 Tj -21.6719 -36.6545 Td -(TIMER_HWSTROBE 6879) 11.438 Tj --7.10543e-14 -37.9636 Td -(SYS_unlink 2712) 9.03 Tj -24.0799 -37.9636 Td -(6879) 2.408 Tj -2.408 -39.2727 Td -(2712 3161) 5.418 Tj -21.6719 -39.2727 Td -(TIMER_INTTC 6874) 9.632 Tj --7.81597e-14 -40.5818 Td -(SYS_wait 2703) 7.826 Tj -24.0799 -40.5818 Td -(6874) 2.408 Tj -2.408 -41.8909 Td -(2703 3134) 5.418 Tj -21.6719 -41.8909 Td -(TIMER_LATCH 6880) 9.632 Tj --8.52651e-14 -43.2 Td -(SYS_write 2705) 8.428 Tj -24.0799 -43.2 Td -(6880) 2.408 Tj -2.408 -44.5091 Td -(2705 3140) 5.418 Tj -21.6719 -44.5091 Td -(TIMER_LSB 6881) 8.428 Tj --9.23706e-14 -45.8182 Td -(tail 3734) 5.418 Tj -24.0799 -45.8182 Td -(6881) 2.408 Tj -2.408 -47.1272 Td -(3722 3734 3792 3806) 11.438 Tj -21.6719 -47.1272 Td -(TIMER_MSB 6882) 8.428 Tj -2.408 -48.4363 Td -(3807 3836 3860 3862) 11.438 Tj -24.0799 -48.4363 Td -(6882) 2.408 Tj -2.408 -49.7454 Td -(3940) 2.408 Tj -21.6719 -49.7454 Td -(TIMER_ONESHOT 6875) 10.836 Tj --9.9476e-14 -51.0545 Td -(T_ALIGN 2820) 7.224 Tj -24.0799 -51.0545 Td -(6875) 2.408 Tj -2.408 -52.3636 Td -(2820) 2.408 Tj -21.6719 -52.3636 Td -(TIMER_RATEGEN 6876) 10.836 Tj --1.06581e-13 -53.6727 Td -(taskstate 0687) 8.428 Tj -24.0799 -53.6727 Td -(6876 6890) 5.418 Tj -2.408 -54.9818 Td -(0687 1965) 5.418 Tj -21.6719 -54.9818 Td -(TIMER_SEL0 6871) 9.03 Tj --1.13687e-13 -56.2909 Td -(T_BOUND 2808) 7.224 Tj -24.0799 -56.2909 Td -(6871 6890) 5.418 Tj -2.408 -57.6 Td -(2808) 2.408 Tj -21.6719 -57.6 Td -(TIMER_SEL1 6872) 9.03 Tj --1.20792e-13 -58.9091 Td -(T_BRKPT 2806) 7.224 Tj -24.0799 -58.9091 Td -(6872) 2.408 Tj -2.408 -60.2181 Td -(2806) 2.408 Tj -21.6719 -60.2181 Td -(TIMER_SEL2 6873) 9.03 Tj --1.27898e-13 -61.5272 Td -(T_DBLFLT 2811) 7.826 Tj -24.0799 -61.5272 Td -(6873) 2.408 Tj -2.408 -62.8363 Td -(2811) 2.408 Tj -21.6719 -62.8363 Td -(TIMER_SQWAVE 6877) 10.234 Tj --1.35003e-13 -64.1454 Td -(T_DEBUG 2804) 7.224 Tj -24.0799 -64.1454 Td -(6877) 2.408 Tj -2.408 -65.4545 Td -(2804) 2.408 Tj -21.6719 -65.4545 Td -(TIMER_SWSTROBE 6878) 11.438 Tj --1.42109e-13 -66.7636 Td -(T_DEFAULT 2827) 8.428 Tj -24.0799 -66.7636 Td -(6878) 2.408 Tj -2.408 -68.0727 Td -(2827) 2.408 Tj -21.6719 -68.0727 Td -(T_MCHK 2821) 6.622 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 cross-references Page 12) 26.488 Tj -2.40799 -3.92728 Td -(2821) 2.408 Tj -24.0799 -3.92728 Td -(2826 2870 2885 3017) 11.438 Tj --1e-05 -5.23637 Td -(T_NMI 2805) 6.02 Tj -21.6719 -5.23637 Td -(T_TSS 2813) 6.02 Tj -2.40799 -6.54546 Td -(2805) 2.408 Tj -24.0799 -6.54546 Td -(2813) 2.408 Tj --1e-05 -7.85455 Td -(T_OFLOW 2807) 7.224 Tj -21.6719 -7.85455 Td -(tvinit 2864) 6.622 Tj -2.40799 -9.16364 Td -(2807) 2.408 Tj -24.0799 -9.16364 Td -(0233 1255 2864) 8.428 Tj --1e-05 -10.4727 Td -(T_PGFLT 2817) 7.224 Tj -21.6719 -10.4727 Td -(unlink 4802) 6.622 Tj -2.40799 -11.7818 Td -(2817) 2.408 Tj -24.0799 -11.7818 Td -(0339 4802 4815 4821) 11.438 Tj --1e-05 -13.0909 Td -(trap 2880) 5.418 Tj -24.0799 -13.0909 Td -(4829 5436) 5.418 Tj -2.40799 -14.4 Td -(0232 0500 0512 0731) 11.438 Tj -21.6719 -14.4 Td -(wakeup 2353) 6.622 Tj -2.40799 -15.7091 Td -(0750 0751 0752 0753) 11.438 Tj -24.0799 -15.7091 Td -(0219 2316 2317 2353) 11.438 Tj -2.40799 -17.0182 Td -(0754 0757 1255 1344) 11.438 Tj -24.0799 -17.0182 Td -(3792 3861 4045 4362) 11.438 Tj -2.40799 -18.3273 Td -(2362 2751 2758 2764) 11.438 Tj -24.0799 -18.3273 Td -(4446 5667 5670 5692) 11.438 Tj -2.40799 -19.6364 Td -(2800 2880 2938 2944) 11.438 Tj -24.0799 -19.6364 Td -(5701 5728 6798) 8.428 Tj -2.40799 -20.9455 Td -(2945 2952 2954) 8.428 Tj -21.6719 -20.9455 Td -(wakeup1 2342) 7.224 Tj --1e-05 -22.2545 Td -(trapframe 0501) 8.428 Tj -24.0799 -22.2545 Td -(2342 2356 2408 2461) 11.438 Tj -2.40799 -23.5636 Td -(0501 1332 1348 1941) 11.438 Tj -21.6719 -23.5636 Td -(wdir 4716) 5.418 Tj -2.40799 -24.8727 Td -(2015 2138 2139 2763) 11.438 Tj -24.0799 -24.8727 Td -(4716 4724 4736 4786) 11.438 Tj -2.40799 -26.1818 Td -(2880) 2.408 Tj -24.0799 -26.1818 Td -(4880) 2.408 Tj --1e-05 -27.4909 Td -(T_SEGNP 2814) 7.224 Tj -21.6719 -27.4909 Td -(write_eflags 0443) 10.234 Tj -2.40799 -28.8 Td -(2814) 2.408 Tj -24.0799 -28.8 Td -(0443) 2.408 Tj --1e-05 -30.1091 Td -(T_SIMDERR 2822) 8.428 Tj -21.6719 -30.1091 Td -(writei 4552) 6.622 Tj -2.40799 -31.4182 Td -(2822) 2.408 Tj -24.0799 -31.4182 Td -(0336 4552 4590 4735) 11.438 Tj --1e-05 -32.7273 Td -(T_STACK 2815) 7.224 Tj -24.0799 -32.7273 Td -(4820 4960 5378 5382) 11.438 Tj -2.40799 -34.0364 Td -(2815) 2.408 Tj -21.6719 -34.0364 Td -(yield 2268) 6.02 Tj --1e-05 -35.3454 Td -(T_SYSCALL 2826) 8.428 Tj -24.0799 -35.3454 Td -(0224 2268 2917) 8.428 Tj +/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 @@ -3708,7 +3809,10 @@ pdfEndPage %%Page: 8 8 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -3716,241 +3820,257 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/types.h Page 1) 22.876 Tj -0 -3.92728 Td -(0100 typedef unsigned int uint;) 18.662 Tj -0 -5.23637 Td -(0101 typedef unsigned short ushort;) 21.07 Tj -0 -6.54546 Td -(0102 typedef unsigned char uchar;) 19.866 Tj -0 -7.85455 Td -(0103 ) 3.01 Tj -0 -9.16364 Td -(0104 ) 3.01 Tj -0 -10.4727 Td -(0105 ) 3.01 Tj -0 -11.7818 Td -(0106 ) 3.01 Tj -0 -13.0909 Td -(0107 ) 3.01 Tj -0 -14.4 Td -(0108 ) 3.01 Tj -0 -15.7091 Td -(0109 ) 3.01 Tj -0 -17.0182 Td -(0110 ) 3.01 Tj -0 -18.3273 Td -(0111 ) 3.01 Tj -0 -19.6364 Td -(0112 ) 3.01 Tj -0 -20.9455 Td -(0113 ) 3.01 Tj -0 -22.2545 Td -(0114 ) 3.01 Tj -0 -23.5636 Td -(0115 ) 3.01 Tj -0 -24.8727 Td -(0116 ) 3.01 Tj -0 -26.1818 Td -(0117 ) 3.01 Tj -0 -27.4909 Td -(0118 ) 3.01 Tj -0 -28.8 Td -(0119 ) 3.01 Tj -0 -30.1091 Td -(0120 ) 3.01 Tj -0 -31.4182 Td -(0121 ) 3.01 Tj -0 -32.7273 Td -(0122 ) 3.01 Tj -0 -34.0364 Td -(0123 ) 3.01 Tj -0 -35.3454 Td -(0124 ) 3.01 Tj -0 -36.6545 Td -(0125 ) 3.01 Tj -0 -37.9636 Td -(0126 ) 3.01 Tj -0 -39.2727 Td -(0127 ) 3.01 Tj -0 -40.5818 Td -(0128 ) 3.01 Tj -0 -41.8909 Td -(0129 ) 3.01 Tj -0 -43.2 Td -(0130 ) 3.01 Tj -0 -44.5091 Td -(0131 ) 3.01 Tj -0 -45.8182 Td -(0132 ) 3.01 Tj -0 -47.1272 Td -(0133 ) 3.01 Tj -0 -48.4363 Td -(0134 ) 3.01 Tj -0 -49.7454 Td -(0135 ) 3.01 Tj -0 -51.0545 Td -(0136 ) 3.01 Tj -0 -52.3636 Td -(0137 ) 3.01 Tj -0 -53.6727 Td -(0138 ) 3.01 Tj -0 -54.9818 Td -(0139 ) 3.01 Tj -0 -56.2909 Td -(0140 ) 3.01 Tj -0 -57.6 Td -(0141 ) 3.01 Tj -0 -58.9091 Td -(0142 ) 3.01 Tj -0 -60.2181 Td -(0143 ) 3.01 Tj -0 -61.5272 Td -(0144 ) 3.01 Tj -0 -62.8363 Td -(0145 ) 3.01 Tj -0 -64.1454 Td -(0146 ) 3.01 Tj -0 -65.4545 Td -(0147 ) 3.01 Tj -0 -66.7636 Td -(0148 ) 3.01 Tj -0 -68.0727 Td -(0149 ) 3.01 Tj -0 -72 Td -(Sheet 01) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/param.h Page 1) 22.876 Tj -0 -3.92728 Td -(0150 #define NPROC 64 // maximum number of processes) 36.12 Tj -0 -5.23637 Td -(0151 #define PAGE 4096 // granularity of user-space memory allocation) 45.752 Tj -0 -6.54546 Td -(0152 #define KSTACKSIZE PAGE // size of per-process kernel stack) 39.13 Tj -0 -7.85455 Td -(0153 #define NCPU 8 // maximum number of CPUs) 33.11 Tj -0 -9.16364 Td -(0154 #define NOFILE 16 // open files per process) 33.11 Tj -0 -10.4727 Td -(0155 #define NFILE 100 // open files per system) 32.508 Tj -0 -11.7818 Td -(0156 #define NREQUEST 100 // outstanding disk requests) 34.916 Tj -0 -13.0909 Td -(0157 #define NBUF 10 // size of disk block cache) 34.314 Tj -0 -14.4 Td -(0158 #define NINODE 100 // maximum number of active i-nodes) 39.13 Tj -0 -15.7091 Td -(0159 #define NDEV 10 // maximum major device number) 36.12 Tj -0 -17.0182 Td -(0160 ) 3.01 Tj -0 -18.3273 Td -(0161 ) 3.01 Tj -0 -19.6364 Td -(0162 ) 3.01 Tj -0 -20.9455 Td -(0163 ) 3.01 Tj -0 -22.2545 Td -(0164 ) 3.01 Tj -0 -23.5636 Td -(0165 ) 3.01 Tj -0 -24.8727 Td -(0166 ) 3.01 Tj -0 -26.1818 Td -(0167 ) 3.01 Tj -0 -27.4909 Td -(0168 ) 3.01 Tj -0 -28.8 Td -(0169 ) 3.01 Tj -0 -30.1091 Td -(0170 ) 3.01 Tj -0 -31.4182 Td -(0171 ) 3.01 Tj -0 -32.7273 Td -(0172 ) 3.01 Tj -0 -34.0364 Td -(0173 ) 3.01 Tj -0 -35.3454 Td -(0174 ) 3.01 Tj -0 -36.6545 Td -(0175 ) 3.01 Tj -0 -37.9636 Td -(0176 ) 3.01 Tj -0 -39.2727 Td -(0177 ) 3.01 Tj -0 -40.5818 Td -(0178 ) 3.01 Tj -0 -41.8909 Td -(0179 ) 3.01 Tj -0 -43.2 Td -(0180 ) 3.01 Tj -0 -44.5091 Td -(0181 ) 3.01 Tj -0 -45.8182 Td -(0182 ) 3.01 Tj -0 -47.1272 Td -(0183 ) 3.01 Tj -0 -48.4363 Td -(0184 ) 3.01 Tj -0 -49.7454 Td -(0185 ) 3.01 Tj -0 -51.0545 Td -(0186 ) 3.01 Tj -0 -52.3636 Td -(0187 ) 3.01 Tj -0 -53.6727 Td -(0188 ) 3.01 Tj -0 -54.9818 Td -(0189 ) 3.01 Tj -0 -56.2909 Td -(0190 ) 3.01 Tj -0 -57.6 Td -(0191 ) 3.01 Tj -0 -58.9091 Td -(0192 ) 3.01 Tj -0 -60.2181 Td -(0193 ) 3.01 Tj -0 -61.5272 Td -(0194 ) 3.01 Tj -0 -62.8363 Td -(0195 ) 3.01 Tj -0 -64.1454 Td -(0196 ) 3.01 Tj -0 -65.4545 Td -(0197 ) 3.01 Tj -0 -66.7636 Td -(0198 ) 3.01 Tj -0 -68.0727 Td -(0199 ) 3.01 Tj -0 -72 Td -(Sheet 01) 4.816 Tj +/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 @@ -3962,6 +4082,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -3969,241 +4092,255 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/defs.h Page 1) 22.274 Tj -0 -3.92728 Td -(0200 // kalloc.c) 9.632 Tj -0 -5.23637 Td -(0201 char* kalloc\(int\);) 13.846 Tj -0 -6.54546 Td -(0202 void kfree\(char*, int\);) 16.856 Tj -0 -7.85455 Td -(0203 void kinit\(void\);) 13.244 Tj -0 -9.16364 Td -(0204 ) 3.01 Tj -0 -10.4727 Td -(0205 // console.c) 10.234 Tj -0 -11.7818 Td -(0206 void console_init\(void\);) 17.458 Tj -0 -13.0909 Td -(0207 void cprintf\(char*, ...\);) 18.06 Tj -0 -14.4 Td -(0208 void panic\(char*\);) 13.846 Tj -0 -15.7091 Td -(0209 void kbd_intr\(void\);) 15.05 Tj -0 -17.0182 Td -(0210 ) 3.01 Tj -0 -18.3273 Td -(0211 // proc.c) 8.428 Tj -0 -19.6364 Td -(0212 void pinit\(void\);) 13.244 Tj -0 -20.9455 Td -(0213 struct proc;) 10.234 Tj -0 -22.2545 Td -(0214 void setupsegs\(struct proc*\);) 20.468 Tj -0 -23.5636 Td -(0215 struct proc* copyproc\(struct proc*\);) 24.682 Tj -0 -24.8727 Td -(0216 struct spinlock;) 12.642 Tj -0 -26.1818 Td -(0217 int growproc\(int\);) 13.846 Tj -0 -27.4909 Td -(0218 void sleep\(void*, struct spinlock*\);) 24.682 Tj -0 -28.8 Td -(0219 void wakeup\(void*\);) 14.448 Tj -0 -30.1091 Td -(0220 void scheduler\(void\);) 15.652 Tj -0 -31.4182 Td -(0221 void proc_exit\(void\);) 15.652 Tj -0 -32.7273 Td -(0222 int proc_kill\(int\);) 14.448 Tj -0 -34.0364 Td -(0223 int proc_wait\(void\);) 15.05 Tj -0 -35.3454 Td -(0224 void yield\(void\);) 13.244 Tj -0 -36.6545 Td -(0225 void procdump\(void\);) 15.05 Tj -0 -37.9636 Td -(0226 ) 3.01 Tj -0 -39.2727 Td -(0227 // setjmp.S) 9.632 Tj -0 -40.5818 Td -(0228 struct jmpbuf;) 11.438 Tj -0 -41.8909 Td -(0229 int setjmp\(struct jmpbuf*\);) 19.264 Tj -0 -43.2 Td -(0230 void longjmp\(struct jmpbuf*\);) 20.468 Tj -0 -44.5091 Td -(0231 ) 3.01 Tj -0 -45.8182 Td -(0232 // trap.c) 8.428 Tj -0 -47.1272 Td -(0233 void tvinit\(void\);) 13.846 Tj -0 -48.4363 Td -(0234 void idtinit\(void\);) 14.448 Tj -0 -49.7454 Td -(0235 ) 3.01 Tj -0 -51.0545 Td -(0236 // string.c) 9.632 Tj -0 -52.3636 Td -(0237 void* memset\(void*, int, uint\);) 21.672 Tj -0 -53.6727 Td -(0238 int memcmp\(const void*, const void*, uint\);) 28.896 Tj -0 -54.9818 Td -(0239 void* memmove\(void*, const void*, uint\);) 27.09 Tj -0 -56.2909 Td -(0240 int strncmp\(const char*, const char*, uint\);) 29.498 Tj -0 -57.6 Td -(0241 ) 3.01 Tj -0 -58.9091 Td -(0242 // syscall.c) 10.234 Tj -0 -60.2181 Td -(0243 void syscall\(void\);) 14.448 Tj -0 -61.5272 Td -(0244 int fetchint\(struct proc*, uint, int*\);) 26.488 Tj -0 -62.8363 Td -(0245 int fetchstr\(struct proc*, uint, char**\);) 27.692 Tj -0 -64.1454 Td -(0246 int argint\(int, int*\);) 16.254 Tj -0 -65.4545 Td -(0247 int argptr\(int, char**, int\);) 20.468 Tj -0 -66.7636 Td -(0248 int argstr\(int, char**\);) 17.458 Tj -0 -68.0727 Td -(0249 ) 3.01 Tj -0 -72 Td -(Sheet 02) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/defs.h Page 2) 22.274 Tj -0 -3.92728 Td -(0250 // picirq.c) 9.632 Tj -0 -5.23637 Td -(0251 void pic_init\(void\);) 15.05 Tj -0 -6.54546 Td -(0252 void irq_enable\(int\);) 15.652 Tj -0 -7.85455 Td -(0253 ) 3.01 Tj -0 -9.16364 Td -(0254 // 8253pit.c) 10.234 Tj -0 -10.4727 Td -(0255 void pit8253_timerinit\(void\);) 20.468 Tj -0 -11.7818 Td -(0256 ) 3.01 Tj -0 -13.0909 Td -(0257 // mp.c) 7.224 Tj -0 -14.4 Td -(0258 extern int ismp;) 12.642 Tj -0 -15.7091 Td -(0259 void mp_init\(void\);) 14.448 Tj -0 -17.0182 Td -(0260 void mp_startthem\(void\);) 17.458 Tj -0 -18.3273 Td -(0261 int mp_bcpu\(void\);) 13.846 Tj -0 -19.6364 Td -(0262 ) 3.01 Tj -0 -20.9455 Td -(0263 // lapic.c) 9.03 Tj -0 -22.2545 Td -(0264 extern uint *lapicaddr;) 16.856 Tj -0 -23.5636 Td -(0265 void lapic_init\(int\);) 15.652 Tj -0 -24.8727 Td -(0266 void lapic_startap\(uchar, int\);) 21.672 Tj -0 -26.1818 Td -(0267 void lapic_timerinit\(void\);) 19.264 Tj -0 -27.4909 Td -(0268 void lapic_timerintr\(void\);) 19.264 Tj -0 -28.8 Td -(0269 void lapic_enableintr\(void\);) 19.866 Tj -0 -30.1091 Td -(0270 void lapic_disableintr\(void\);) 20.468 Tj -0 -31.4182 Td -(0271 void lapic_eoi\(void\);) 15.652 Tj -0 -32.7273 Td -(0272 int cpu\(void\);) 11.438 Tj -0 -34.0364 Td -(0273 ) 3.01 Tj -0 -35.3454 Td -(0274 // ioapic.c) 9.632 Tj -0 -36.6545 Td -(0275 extern uchar ioapic_id;) 16.856 Tj -0 -37.9636 Td -(0276 void ioapic_init\(void\);) 16.856 Tj -0 -39.2727 Td -(0277 void ioapic_enable\(int irq, int cpu\);) 25.284 Tj -0 -40.5818 Td -(0278 ) 3.01 Tj -0 -41.8909 Td -(0279 // spinlock.c) 10.836 Tj -0 -43.2 Td -(0280 struct spinlock;) 12.642 Tj -0 -44.5091 Td -(0281 void initlock\(struct spinlock*, char*\);) 26.488 Tj -0 -45.8182 Td -(0282 void acquire\(struct spinlock*\);) 21.672 Tj -0 -47.1272 Td -(0283 void release\(struct spinlock*\);) 21.672 Tj -0 -48.4363 Td -(0284 int holding\(struct spinlock*\);) 21.07 Tj -0 -49.7454 Td -(0285 void getcallerpcs\(void*, uint*\);) 22.274 Tj -0 -51.0545 Td -(0286 ) 3.01 Tj -0 -52.3636 Td -(0287 // main.c) 8.428 Tj -0 -53.6727 Td -(0288 void load_icode\(struct proc*, uchar*, uint\);) 29.498 Tj -0 -54.9818 Td -(0289 ) 3.01 Tj -0 -56.2909 Td -(0290 // pipe.c) 8.428 Tj -0 -57.6 Td -(0291 struct pipe;) 10.234 Tj -0 -58.9091 Td -(0292 struct file;) 10.234 Tj -0 -60.2181 Td -(0293 int pipe_alloc\(struct file**, struct file**\);) 30.1 Tj -0 -61.5272 Td -(0294 void pipe_close\(struct pipe*, int\);) 24.08 Tj -0 -62.8363 Td -(0295 int pipe_write\(struct pipe*, char*, int\);) 27.692 Tj -0 -64.1454 Td -(0296 int pipe_read\(struct pipe*, char*, int\);) 27.09 Tj -0 -65.4545 Td -(0297 ) 3.01 Tj -0 -66.7636 Td -(0298 ) 3.01 Tj -0 -68.0727 Td -(0299 ) 3.01 Tj -0 -72 Td -(Sheet 02) 4.816 Tj +/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 @@ -4214,7 +4351,10 @@ pdfEndPage %%Page: 10 10 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -4222,241 +4362,259 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/defs.h Page 3) 22.274 Tj -0 -3.92728 Td -(0300 // file.c) 8.428 Tj -0 -5.23637 Td -(0301 struct stat;) 10.234 Tj -0 -6.54546 Td -(0302 void fileinit\(void\);) 15.05 Tj -0 -7.85455 Td -(0303 struct file* filealloc\(void\);) 20.468 Tj -0 -9.16364 Td -(0304 void fileclose\(struct file*\);) 20.468 Tj -0 -10.4727 Td -(0305 int fileread\(struct file*, char*, int n\);) 27.692 Tj -0 -11.7818 Td -(0306 int filewrite\(struct file*, char*, int n\);) 28.294 Tj -0 -13.0909 Td -(0307 int filestat\(struct file*, struct stat*\);) 27.692 Tj -0 -14.4 Td -(0308 void fileincref\(struct file*\);) 21.07 Tj -0 -15.7091 Td -(0309 ) 3.01 Tj -0 -17.0182 Td -(0310 // ide.c) 7.826 Tj -0 -18.3273 Td -(0311 void ide_init\(void\);) 15.05 Tj -0 -19.6364 Td -(0312 void ide_intr\(void\);) 15.05 Tj -0 -20.9455 Td -(0313 void ide_rw\(int, uint, void*, uint, int\);) 27.692 Tj -0 -22.2545 Td -(0314 ) 3.01 Tj -0 -23.5636 Td -(0315 // bio.c) 7.826 Tj -0 -24.8727 Td -(0316 void binit\(void\);) 13.244 Tj -0 -26.1818 Td -(0317 struct buf;) 9.632 Tj -0 -27.4909 Td -(0318 struct buf* getblk\(uint dev, uint sector\);) 28.294 Tj -0 -28.8 Td -(0319 struct buf* bread\(uint, uint\);) 21.07 Tj -0 -30.1091 Td -(0320 void bwrite\(struct buf*, uint\);) 21.672 Tj -0 -31.4182 Td -(0321 void brelse\(struct buf*\);) 18.06 Tj -0 -32.7273 Td -(0322 ) 3.01 Tj -0 -34.0364 Td -(0323 // fs.c) 7.224 Tj -0 -35.3454 Td -(0324 extern uint rootdev;) 15.05 Tj -0 -36.6545 Td -(0325 void iinit\(void\);) 13.244 Tj -0 -37.9636 Td -(0326 struct inode* iget\(uint, uint\);) 21.672 Tj -0 -39.2727 Td -(0327 void ilock\(struct inode*\);) 18.662 Tj -0 -40.5818 Td -(0328 void iunlock\(struct inode*\);) 19.866 Tj -0 -41.8909 Td -(0329 void itrunc\(struct inode*\);) 19.264 Tj -0 -43.2 Td -(0330 void idecref\(struct inode*\);) 19.866 Tj -0 -44.5091 Td -(0331 void iincref\(struct inode*\);) 19.866 Tj -0 -45.8182 Td -(0332 void iput\(struct inode*\);) 18.06 Tj -0 -47.1272 Td -(0333 struct inode* namei\(char*, int, uint*, char**, struct inode**\);) 40.936 Tj -0 -48.4363 Td -(0334 void stati\(struct inode*, struct stat*\);) 27.09 Tj -0 -49.7454 Td -(0335 int readi\(struct inode*, char*, uint, uint\);) 29.498 Tj -0 -51.0545 Td -(0336 int writei\(struct inode*, char*, uint, uint\);) 30.1 Tj -0 -52.3636 Td -(0337 struct inode* mknod\(char*, short, short, short\);) 31.906 Tj -0 -53.6727 Td -(0338 struct inode* mknod1\(struct inode*, char*, short, short, short\);) 41.538 Tj -0 -54.9818 Td -(0339 int unlink\(char*\);) 13.846 Tj -0 -56.2909 Td -(0340 void iupdate\(struct inode*\);) 19.866 Tj -0 -57.6 Td -(0341 int link\(char*, char*\);) 16.856 Tj -0 -58.9091 Td -(0342 ) 3.01 Tj -0 -60.2181 Td -(0343 ) 3.01 Tj -0 -61.5272 Td -(0344 ) 3.01 Tj -0 -62.8363 Td -(0345 ) 3.01 Tj -0 -64.1454 Td -(0346 ) 3.01 Tj -0 -65.4545 Td -(0347 ) 3.01 Tj -0 -66.7636 Td -(0348 ) 3.01 Tj -0 -68.0727 Td -(0349 ) 3.01 Tj -0 -72 Td -(Sheet 03) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/x86.h Page 1) 21.672 Tj -0 -3.92728 Td -(0350 // Special assembly routines to access x86-specific) 33.712 Tj -0 -5.23637 Td -(0351 // hardware instructions.) 18.06 Tj -0 -6.54546 Td -(0352 ) 3.01 Tj -0 -7.85455 Td -(0353 static __inline uchar) 15.652 Tj -0 -9.16364 Td -(0354 inb\(int port\)) 10.836 Tj -0 -10.4727 Td -(0355 {) 3.612 Tj -0 -11.7818 Td -(0356 uchar data;) 10.836 Tj -0 -13.0909 Td -(0357 __asm __volatile\("inb %w1,%0" : "=a" \(data\) : "d" \(port\)\);) 39.13 Tj -0 -14.4 Td -(0358 return data;) 11.438 Tj -0 -15.7091 Td -(0359 }) 3.612 Tj -0 -17.0182 Td -(0360 ) 3.01 Tj -0 -18.3273 Td -(0361 static __inline void) 15.05 Tj -0 -19.6364 Td -(0362 insl\(int port, void *addr, int cnt\)) 24.08 Tj -0 -20.9455 Td -(0363 {) 3.612 Tj -0 -22.2545 Td -(0364 __asm __volatile\("cld\\n\\trepne\\n\\tinsl" :) 31.304 Tj -0 -23.5636 Td -(0365 "=D" \(addr\), "=c" \(cnt\) :) 31.304 Tj -0 -24.8727 Td -(0366 "d" \(port\), "0" \(addr\), "1" \(cnt\) :) 36.12 Tj -0 -26.1818 Td -(0367 "memory", "cc"\);) 24.08 Tj -0 -27.4909 Td -(0368 }) 3.612 Tj -0 -28.8 Td -(0369 ) 3.01 Tj -0 -30.1091 Td -(0370 static __inline void) 15.05 Tj -0 -31.4182 Td -(0371 outb\(int port, uchar data\)) 18.662 Tj -0 -32.7273 Td -(0372 {) 3.612 Tj -0 -34.0364 Td -(0373 __asm __volatile\("outb %0,%w1" : : "a" \(data\), "d" \(port\)\);) 39.732 Tj -0 -35.3454 Td -(0374 }) 3.612 Tj -0 -36.6545 Td -(0375 ) 3.01 Tj -0 -37.9636 Td -(0376 static __inline void) 15.05 Tj -0 -39.2727 Td -(0377 outw\(int port, ushort data\)) 19.264 Tj -0 -40.5818 Td -(0378 {) 3.612 Tj -0 -41.8909 Td -(0379 __asm __volatile\("outw %0,%w1" : : "a" \(data\), "d" \(port\)\);) 39.732 Tj -0 -43.2 Td -(0380 }) 3.612 Tj -0 -44.5091 Td -(0381 ) 3.01 Tj -0 -45.8182 Td -(0382 static __inline void) 15.05 Tj -0 -47.1272 Td -(0383 outsl\(int port, const void *addr, int cnt\)) 28.294 Tj -0 -48.4363 Td -(0384 {) 3.612 Tj -0 -49.7454 Td -(0385 __asm __volatile\("cld\\n\\trepne\\n\\toutsl" :) 31.304 Tj -0 -51.0545 Td -(0386 "=S" \(addr\), "=c" \(cnt\) :) 31.304 Tj -0 -52.3636 Td -(0387 "d" \(port\), "0" \(addr\), "1" \(cnt\) :) 36.12 Tj -0 -53.6727 Td -(0388 "cc"\);) 18.06 Tj -0 -54.9818 Td -(0389 }) 3.612 Tj -0 -56.2909 Td -(0390 ) 3.01 Tj -0 -57.6 Td -(0391 ) 3.01 Tj -0 -58.9091 Td -(0392 ) 3.01 Tj -0 -60.2181 Td -(0393 ) 3.01 Tj -0 -61.5272 Td -(0394 ) 3.01 Tj -0 -62.8363 Td -(0395 ) 3.01 Tj -0 -64.1454 Td -(0396 ) 3.01 Tj -0 -65.4545 Td -(0397 ) 3.01 Tj -0 -66.7636 Td -(0398 ) 3.01 Tj -0 -68.0727 Td -(0399 ) 3.01 Tj -0 -72 Td -(Sheet 03) 4.816 Tj +/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 @@ -4468,6 +4626,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -4475,241 +4636,257 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/x86.h Page 2) 21.672 Tj -0 -3.92728 Td -(0400 struct segdesc;) 12.04 Tj -0 -5.23637 Td -(0401 ) 3.01 Tj -0 -6.54546 Td -(0402 static __inline void) 15.05 Tj -0 -7.85455 Td -(0403 lgdt\(struct segdesc *p, int size\)) 22.876 Tj -0 -9.16364 Td -(0404 {) 3.612 Tj -0 -10.4727 Td -(0405 volatile ushort pd[3];) 17.458 Tj -0 -11.7818 Td -(0406 ) 3.01 Tj -0 -13.0909 Td -(0407 pd[0] = size-1;) 13.244 Tj -0 -14.4 Td -(0408 pd[1] = \(uint\)p;) 13.846 Tj -0 -15.7091 Td -(0409 pd[2] = \(uint\)p >> 16;) 17.458 Tj -0 -17.0182 Td -(0410 ) 3.01 Tj -0 -18.3273 Td -(0411 asm volatile\("lgdt \(%0\)" : : "g" \(pd\)\);) 27.692 Tj -0 -19.6364 Td -(0412 }) 3.612 Tj -0 -20.9455 Td -(0413 ) 3.01 Tj -0 -22.2545 Td -(0414 struct gatedesc;) 12.642 Tj -0 -23.5636 Td -(0415 ) 3.01 Tj -0 -24.8727 Td -(0416 static __inline void) 15.05 Tj -0 -26.1818 Td -(0417 lidt\(struct gatedesc *p, int size\)) 23.478 Tj -0 -27.4909 Td -(0418 {) 3.612 Tj -0 -28.8 Td -(0419 volatile ushort pd[3];) 17.458 Tj -0 -30.1091 Td -(0420 ) 3.01 Tj -0 -31.4182 Td -(0421 pd[0] = size-1;) 13.244 Tj -0 -32.7273 Td -(0422 pd[1] = \(uint\)p;) 13.846 Tj -0 -34.0364 Td -(0423 pd[2] = \(uint\)p >> 16;) 17.458 Tj -0 -35.3454 Td -(0424 ) 3.01 Tj -0 -36.6545 Td -(0425 asm volatile\("lidt \(%0\)" : : "g" \(pd\)\);) 27.692 Tj -0 -37.9636 Td -(0426 }) 3.612 Tj -0 -39.2727 Td -(0427 ) 3.01 Tj -0 -40.5818 Td -(0428 static __inline void) 15.05 Tj -0 -41.8909 Td -(0429 ltr\(ushort sel\)) 12.04 Tj -0 -43.2 Td -(0430 {) 3.612 Tj -0 -44.5091 Td -(0431 __asm __volatile\("ltr %0" : : "r" \(sel\)\);) 28.896 Tj -0 -45.8182 Td -(0432 }) 3.612 Tj -0 -47.1272 Td -(0433 ) 3.01 Tj -0 -48.4363 Td -(0434 static __inline uint) 15.05 Tj -0 -49.7454 Td -(0435 read_eflags\(void\)) 13.244 Tj -0 -51.0545 Td -(0436 {) 3.612 Tj -0 -52.3636 Td -(0437 uint eflags;) 11.438 Tj -0 -53.6727 Td -(0438 __asm __volatile\("pushfl; popl %0" : "=r" \(eflags\)\);) 35.518 Tj -0 -54.9818 Td -(0439 return eflags;) 12.642 Tj -0 -56.2909 Td -(0440 }) 3.612 Tj -0 -57.6 Td -(0441 ) 3.01 Tj -0 -58.9091 Td -(0442 static __inline void) 15.05 Tj -0 -60.2181 Td -(0443 write_eflags\(uint eflags\)) 18.06 Tj -0 -61.5272 Td -(0444 {) 3.612 Tj -0 -62.8363 Td -(0445 __asm __volatile\("pushl %0; popfl" : : "r" \(eflags\)\);) 36.12 Tj -0 -64.1454 Td -(0446 }) 3.612 Tj -0 -65.4545 Td -(0447 ) 3.01 Tj -0 -66.7636 Td -(0448 ) 3.01 Tj -0 -68.0727 Td -(0449 ) 3.01 Tj -0 -72 Td -(Sheet 04) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/x86.h Page 3) 21.672 Tj -0 -3.92728 Td -(0450 static __inline void) 15.05 Tj -0 -5.23637 Td -(0451 cpuid\(uint info, uint *eaxp, uint *ebxp, uint *ecxp, uint *edxp\)) 41.538 Tj -0 -6.54546 Td -(0452 {) 3.612 Tj -0 -7.85455 Td -(0453 uint eax, ebx, ecx, edx;) 18.662 Tj -0 -9.16364 Td -(0454 asm volatile\("cpuid" :) 17.458 Tj -0 -10.4727 Td -(0455 "=a" \(eax\), "=b" \(ebx\), "=c" \(ecx\), "=d" \(edx\) :) 40.936 Tj -0 -11.7818 Td -(0456 "a" \(info\)\);) 19.264 Tj -0 -13.0909 Td -(0457 if\(eaxp\)) 9.03 Tj -0 -14.4 Td -(0458 *eaxp = eax;) 12.642 Tj -0 -15.7091 Td -(0459 if\(ebxp\)) 9.03 Tj -0 -17.0182 Td -(0460 *ebxp = ebx;) 12.642 Tj -0 -18.3273 Td -(0461 if\(ecxp\)) 9.03 Tj -0 -19.6364 Td -(0462 *ecxp = ecx;) 12.642 Tj -0 -20.9455 Td -(0463 if\(edxp\)) 9.03 Tj -0 -22.2545 Td -(0464 *edxp = edx;) 12.642 Tj -0 -23.5636 Td -(0465 }) 3.612 Tj -0 -24.8727 Td -(0466 ) 3.01 Tj -0 -26.1818 Td -(0467 static __inline uint) 15.05 Tj -0 -27.4909 Td -(0468 cmpxchg\(uint oldval, uint newval, volatile uint* lock_addr\)) 38.528 Tj -0 -28.8 Td -(0469 {) 3.612 Tj -0 -30.1091 Td -(0470 uint result;) 11.438 Tj -0 -31.4182 Td -(0471 __asm__ __volatile__\("lock; cmpxchgl %2, %0" :) 31.906 Tj -0 -32.7273 Td -(0472 "+m" \(*lock_addr\), "=a" \(result\) :) 37.324 Tj -0 -34.0364 Td -(0473 "r"\(newval\), "1"\(oldval\) :) 32.508 Tj -0 -35.3454 Td -(0474 "cc"\);) 20.468 Tj -0 -36.6545 Td -(0475 return result;) 12.642 Tj -0 -37.9636 Td -(0476 }) 3.612 Tj -0 -39.2727 Td -(0477 ) 3.01 Tj -0 -40.5818 Td -(0478 static __inline void) 15.05 Tj -0 -41.8909 Td -(0479 cli\(void\)) 8.428 Tj -0 -43.2 Td -(0480 {) 3.612 Tj -0 -44.5091 Td -(0481 __asm__ volatile\("cli"\);) 18.662 Tj -0 -45.8182 Td -(0482 }) 3.612 Tj -0 -47.1272 Td -(0483 ) 3.01 Tj -0 -48.4363 Td -(0484 static __inline void) 15.05 Tj -0 -49.7454 Td -(0485 sti\(void\)) 8.428 Tj -0 -51.0545 Td -(0486 {) 3.612 Tj -0 -52.3636 Td -(0487 __asm__ volatile\("sti"\);) 18.662 Tj -0 -53.6727 Td -(0488 }) 3.612 Tj -0 -54.9818 Td -(0489 ) 3.01 Tj -0 -56.2909 Td -(0490 ) 3.01 Tj -0 -57.6 Td -(0491 ) 3.01 Tj -0 -58.9091 Td -(0492 ) 3.01 Tj -0 -60.2181 Td -(0493 ) 3.01 Tj -0 -61.5272 Td -(0494 ) 3.01 Tj -0 -62.8363 Td -(0495 ) 3.01 Tj -0 -64.1454 Td -(0496 ) 3.01 Tj -0 -65.4545 Td -(0497 ) 3.01 Tj -0 -66.7636 Td -(0498 ) 3.01 Tj -0 -68.0727 Td -(0499 ) 3.01 Tj -0 -72 Td -(Sheet 04) 4.816 Tj +/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 @@ -4720,7 +4897,10 @@ pdfEndPage %%Page: 12 12 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -4728,241 +4908,265 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/x86.h Page 4) 21.672 Tj -0 -3.92728 Td -(0500 // Layout of the trap frame on the stack upon entry to trap.) 39.13 Tj -0 -5.23637 Td -(0501 struct trapframe {) 13.846 Tj -0 -6.54546 Td -(0502 // registers as pushed by pusha) 22.876 Tj -0 -7.85455 Td -(0503 uint edi;) 9.632 Tj -0 -9.16364 Td -(0504 uint esi;) 9.632 Tj -0 -10.4727 Td -(0505 uint ebp;) 9.632 Tj -0 -11.7818 Td -(0506 uint oesp; // useless & ignored) 25.886 Tj -0 -13.0909 Td -(0507 uint ebx;) 9.632 Tj -0 -14.4 Td -(0508 uint edx;) 9.632 Tj -0 -15.7091 Td -(0509 uint ecx;) 9.632 Tj -0 -17.0182 Td -(0510 uint eax;) 9.632 Tj -0 -18.3273 Td -(0511 ) 3.01 Tj -0 -19.6364 Td -(0512 // rest of trap frame) 16.856 Tj -0 -20.9455 Td -(0513 ushort es;) 10.234 Tj -0 -22.2545 Td -(0514 ushort padding1;) 13.846 Tj -0 -23.5636 Td -(0515 ushort ds;) 10.234 Tj -0 -24.8727 Td -(0516 ushort padding2;) 13.846 Tj -0 -26.1818 Td -(0517 uint trapno;) 11.438 Tj -0 -27.4909 Td -(0518 ) 3.01 Tj -0 -28.8 Td -(0519 // below here defined by x86 hardware) 26.488 Tj -0 -30.1091 Td -(0520 uint err;) 9.632 Tj -0 -31.4182 Td -(0521 uint eip;) 9.632 Tj -0 -32.7273 Td -(0522 ushort cs;) 10.234 Tj -0 -34.0364 Td -(0523 ushort padding3;) 13.846 Tj -0 -35.3454 Td -(0524 uint eflags;) 11.438 Tj -0 -36.6545 Td -(0525 ) 3.01 Tj -0 -37.9636 Td -(0526 // below here only when crossing rings, such as from user to kernel) 44.548 Tj -0 -39.2727 Td -(0527 uint esp;) 9.632 Tj -0 -40.5818 Td -(0528 ushort ss;) 10.234 Tj -0 -41.8909 Td -(0529 ushort padding4;) 13.846 Tj -0 -43.2 Td -(0530 };) 4.214 Tj -0 -44.5091 Td -(0531 ) 3.01 Tj -0 -45.8182 Td -(0532 ) 3.01 Tj -0 -47.1272 Td -(0533 ) 3.01 Tj -0 -48.4363 Td -(0534 ) 3.01 Tj -0 -49.7454 Td -(0535 ) 3.01 Tj -0 -51.0545 Td -(0536 ) 3.01 Tj -0 -52.3636 Td -(0537 ) 3.01 Tj -0 -53.6727 Td -(0538 ) 3.01 Tj -0 -54.9818 Td -(0539 ) 3.01 Tj -0 -56.2909 Td -(0540 ) 3.01 Tj -0 -57.6 Td -(0541 ) 3.01 Tj -0 -58.9091 Td -(0542 ) 3.01 Tj -0 -60.2181 Td -(0543 ) 3.01 Tj -0 -61.5272 Td -(0544 ) 3.01 Tj -0 -62.8363 Td -(0545 ) 3.01 Tj -0 -64.1454 Td -(0546 ) 3.01 Tj -0 -65.4545 Td -(0547 ) 3.01 Tj -0 -66.7636 Td -(0548 ) 3.01 Tj -0 -68.0727 Td -(0549 ) 3.01 Tj -0 -72 Td -(Sheet 05) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/asm.h Page 1) 21.672 Tj -0 -3.92728 Td -(0550 //) 4.214 Tj -0 -5.23637 Td -(0551 // macros to create x86 segments from assembler) 31.304 Tj -0 -6.54546 Td -(0552 //) 4.214 Tj -0 -7.85455 Td -(0553 ) 3.01 Tj -0 -9.16364 Td -(0554 #define SEG_NULLASM \\) 42.14 Tj -0 -10.4727 Td -(0555 .word 0, 0; \\) 42.14 Tj -0 -11.7818 Td -(0556 .byte 0, 0, 0, 0) 17.458 Tj -0 -13.0909 Td -(0557 ) 3.01 Tj -0 -14.4 Td -(0558 #define SEG_ASM\(type,base,lim\) \\) 42.14 Tj -0 -15.7091 Td -(0559 .word \(\(\(lim\) >> 12\) & 0xffff\), \(\(base\) & 0xffff\); \\) 42.14 Tj -0 -17.0182 Td -(0560 .byte \(\(\(base\) >> 16\) & 0xff\), \(0x90 | \(type\)\), \\) 42.14 Tj -0 -18.3273 Td -(0561 \(0xC0 | \(\(\(lim\) >> 28\) & 0xf\)\), \(\(\(base\) >> 24\) & 0xff\)) 45.752 Tj -0 -19.6364 Td -(0562 ) 3.01 Tj -0 -20.9455 Td -(0563 #define STA_X 0x8 // Executable segment) 32.508 Tj -0 -22.2545 Td -(0564 #define STA_E 0x4 // Expand down \(non-executable segments\)) 43.946 Tj -0 -23.5636 Td -(0565 #define STA_C 0x4 // Conforming code segment \(executable only\)) 46.354 Tj -0 -24.8727 Td -(0566 #define STA_W 0x2 // Writeable \(non-executable segments\)) 42.742 Tj -0 -26.1818 Td -(0567 #define STA_R 0x2 // Readable \(executable segments\)) 39.732 Tj -0 -27.4909 Td -(0568 #define STA_A 0x1 // Accessed) 26.488 Tj -0 -28.8 Td -(0569 ) 3.01 Tj -0 -30.1091 Td -(0570 ) 3.01 Tj -0 -31.4182 Td -(0571 ) 3.01 Tj -0 -32.7273 Td -(0572 ) 3.01 Tj -0 -34.0364 Td -(0573 ) 3.01 Tj -0 -35.3454 Td -(0574 ) 3.01 Tj -0 -36.6545 Td -(0575 ) 3.01 Tj -0 -37.9636 Td -(0576 ) 3.01 Tj -0 -39.2727 Td -(0577 ) 3.01 Tj -0 -40.5818 Td -(0578 ) 3.01 Tj -0 -41.8909 Td -(0579 ) 3.01 Tj -0 -43.2 Td -(0580 ) 3.01 Tj -0 -44.5091 Td -(0581 ) 3.01 Tj -0 -45.8182 Td -(0582 ) 3.01 Tj -0 -47.1272 Td -(0583 ) 3.01 Tj -0 -48.4363 Td -(0584 ) 3.01 Tj -0 -49.7454 Td -(0585 ) 3.01 Tj -0 -51.0545 Td -(0586 ) 3.01 Tj -0 -52.3636 Td -(0587 ) 3.01 Tj -0 -53.6727 Td -(0588 ) 3.01 Tj -0 -54.9818 Td -(0589 ) 3.01 Tj -0 -56.2909 Td -(0590 ) 3.01 Tj -0 -57.6 Td -(0591 ) 3.01 Tj -0 -58.9091 Td -(0592 ) 3.01 Tj -0 -60.2181 Td -(0593 ) 3.01 Tj -0 -61.5272 Td -(0594 ) 3.01 Tj -0 -62.8363 Td -(0595 ) 3.01 Tj -0 -64.1454 Td -(0596 ) 3.01 Tj -0 -65.4545 Td -(0597 ) 3.01 Tj -0 -66.7636 Td -(0598 ) 3.01 Tj -0 -68.0727 Td -(0599 ) 3.01 Tj -0 -72 Td -(Sheet 05) 4.816 Tj +/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 @@ -4974,6 +5178,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -4981,241 +5188,277 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mmu.h Page 1) 21.672 Tj -0 -3.92728 Td -(0600 // This file contains definitions for the) 27.692 Tj -0 -5.23637 Td -(0601 // x86 memory management unit \(MMU\).) 24.682 Tj -0 -6.54546 Td -(0602 ) 3.01 Tj -0 -7.85455 Td -(0603 // Eflags register) 13.846 Tj -0 -9.16364 Td -(0604 #define FL_CF 0x00000001 // Carry Flag) 34.916 Tj -0 -10.4727 Td -(0605 #define FL_PF 0x00000004 // Parity Flag) 35.518 Tj -0 -11.7818 Td -(0606 #define FL_AF 0x00000010 // Auxiliary carry Flag) 40.936 Tj -0 -13.0909 Td -(0607 #define FL_ZF 0x00000040 // Zero Flag) 34.314 Tj -0 -14.4 Td -(0608 #define FL_SF 0x00000080 // Sign Flag) 34.314 Tj -0 -15.7091 Td -(0609 #define FL_TF 0x00000100 // Trap Flag) 34.314 Tj -0 -17.0182 Td -(0610 #define FL_IF 0x00000200 // Interrupt Enable) 38.528 Tj -0 -18.3273 Td -(0611 #define FL_DF 0x00000400 // Direction Flag) 37.324 Tj -0 -19.6364 Td -(0612 #define FL_OF 0x00000800 // Overflow Flag) 36.722 Tj -0 -20.9455 Td -(0613 #define FL_IOPL_MASK 0x00003000 // I/O Privilege Level bitmask) 45.15 Tj -0 -22.2545 Td -(0614 #define FL_IOPL_0 0x00000000 // IOPL == 0) 35.518 Tj -0 -23.5636 Td -(0615 #define FL_IOPL_1 0x00001000 // IOPL == 1) 35.518 Tj -0 -24.8727 Td -(0616 #define FL_IOPL_2 0x00002000 // IOPL == 2) 35.518 Tj -0 -26.1818 Td -(0617 #define FL_IOPL_3 0x00003000 // IOPL == 3) 35.518 Tj -0 -27.4909 Td -(0618 #define FL_NT 0x00004000 // Nested Task) 35.518 Tj -0 -28.8 Td -(0619 #define FL_RF 0x00010000 // Resume Flag) 35.518 Tj -0 -30.1091 Td -(0620 #define FL_VM 0x00020000 // Virtual 8086 mode) 39.13 Tj -0 -31.4182 Td -(0621 #define FL_AC 0x00040000 // Alignment Check) 37.926 Tj -0 -32.7273 Td -(0622 #define FL_VIF 0x00080000 // Virtual Interrupt Flag) 42.14 Tj -0 -34.0364 Td -(0623 #define FL_VIP 0x00100000 // Virtual Interrupt Pending) 43.946 Tj -0 -35.3454 Td -(0624 #define FL_ID 0x00200000 // ID flag) 33.11 Tj -0 -36.6545 Td -(0625 ) 3.01 Tj -0 -37.9636 Td -(0626 // Segment Descriptor) 15.652 Tj -0 -39.2727 Td -(0627 struct segdesc {) 12.642 Tj -0 -40.5818 Td -(0628 uint lim_15_0 : 16; // Low bits of segment limit) 33.712 Tj -0 -41.8909 Td -(0629 uint base_15_0 : 16; // Low bits of segment base address) 37.926 Tj -0 -43.2 Td -(0630 uint base_23_16 : 8; // Middle bits of segment base address) 39.732 Tj -0 -44.5091 Td -(0631 uint type : 4; // Segment type \(see STS_ constants\)) 38.528 Tj -0 -45.8182 Td -(0632 uint s : 1; // 0 = system, 1 = application) 34.916 Tj -0 -47.1272 Td -(0633 uint dpl : 2; // Descriptor Privilege Level) 34.314 Tj -0 -48.4363 Td -(0634 uint p : 1; // Present) 22.876 Tj -0 -49.7454 Td -(0635 uint lim_19_16 : 4; // High bits of segment limit) 34.314 Tj -0 -51.0545 Td -(0636 uint avl : 1; // Unused \(available for software use\)) 39.732 Tj -0 -52.3636 Td -(0637 uint rsv1 : 1; // Reserved) 23.478 Tj -0 -53.6727 Td -(0638 uint db : 1; // 0 = 16-bit segment, 1 = 32-bit segment) 41.538 Tj -0 -54.9818 Td -(0639 uint g : 1; // Granularity: limit scaled by 4K when set) 42.742 Tj -0 -56.2909 Td -(0640 uint base_31_24 : 8; // High bits of segment base address) 38.528 Tj -0 -57.6 Td -(0641 };) 4.214 Tj -0 -58.9091 Td -(0642 ) 3.01 Tj -0 -60.2181 Td -(0643 ) 3.01 Tj -0 -61.5272 Td -(0644 ) 3.01 Tj -0 -62.8363 Td -(0645 ) 3.01 Tj -0 -64.1454 Td -(0646 ) 3.01 Tj -0 -65.4545 Td -(0647 ) 3.01 Tj -0 -66.7636 Td -(0648 ) 3.01 Tj -0 -68.0727 Td -(0649 ) 3.01 Tj -0 -72 Td -(Sheet 06) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mmu.h Page 2) 21.672 Tj -0 -3.92728 Td -(0650 // Null segment) 12.04 Tj -0 -5.23637 Td -(0651 #define SEG_NULL \(struct segdesc\){ 0,0,0,0,0,0,0,0,0,0,0,0,0 }) 44.548 Tj -0 -6.54546 Td -(0652 ) 3.01 Tj -0 -7.85455 Td -(0653 // Normal segment) 13.244 Tj -0 -9.16364 Td -(0654 #define SEG\(type, base, lim, dpl\) \(struct segdesc\) \\) 46.956 Tj -0 -10.4727 Td -(0655 { \(\(lim\) >> 12\) & 0xffff, \(base\) & 0xffff, \(\(base\) >> 16\) & 0xff, \\) 46.956 Tj -0 -11.7818 Td -(0656 type, 1, dpl, 1, \(uint\) \(lim\) >> 28, 0, 0, 1, 1, \\) 42.14 Tj -0 -13.0909 Td -(0657 \(uint\) \(base\) >> 24 }) 18.06 Tj -0 -14.4 Td -(0658 ) 3.01 Tj -0 -15.7091 Td -(0659 #define SEG16\(type, base, lim, dpl\) \(struct segdesc\) \\) 46.956 Tj -0 -17.0182 Td -(0660 { \(lim\) & 0xffff, \(base\) & 0xffff, \(\(base\) >> 16\) & 0xff, \\) 46.956 Tj -0 -18.3273 Td -(0661 type, 1, dpl, 1, \(uint\) \(lim\) >> 16, 0, 0, 1, 0, \\) 42.14 Tj -0 -19.6364 Td -(0662 \(uint\) \(base\) >> 24 }) 18.06 Tj -0 -20.9455 Td -(0663 ) 3.01 Tj -0 -22.2545 Td -(0664 // Application segment type bits) 22.274 Tj -0 -23.5636 Td -(0665 #define STA_X 0x8 // Executable segment) 32.508 Tj -0 -24.8727 Td -(0666 #define STA_E 0x4 // Expand down \(non-executable segments\)) 43.946 Tj -0 -26.1818 Td -(0667 #define STA_C 0x4 // Conforming code segment \(executable only\)) 46.354 Tj -0 -27.4909 Td -(0668 #define STA_W 0x2 // Writeable \(non-executable segments\)) 42.742 Tj -0 -28.8 Td -(0669 #define STA_R 0x2 // Readable \(executable segments\)) 39.732 Tj -0 -30.1091 Td -(0670 #define STA_A 0x1 // Accessed) 26.488 Tj -0 -31.4182 Td -(0671 ) 3.01 Tj -0 -32.7273 Td -(0672 // System segment type bits) 19.264 Tj -0 -34.0364 Td -(0673 #define STS_T16A 0x1 // Available 16-bit TSS) 33.712 Tj -0 -35.3454 Td -(0674 #define STS_LDT 0x2 // Local Descriptor Table) 34.916 Tj -0 -36.6545 Td -(0675 #define STS_T16B 0x3 // Busy 16-bit TSS) 30.702 Tj -0 -37.9636 Td -(0676 #define STS_CG16 0x4 // 16-bit Call Gate) 31.304 Tj -0 -39.2727 Td -(0677 #define STS_TG 0x5 // Task Gate / Coum Transmitions) 39.13 Tj -0 -40.5818 Td -(0678 #define STS_IG16 0x6 // 16-bit Interrupt Gate) 34.314 Tj -0 -41.8909 Td -(0679 #define STS_TG16 0x7 // 16-bit Trap Gate) 31.304 Tj -0 -43.2 Td -(0680 #define STS_T32A 0x9 // Available 32-bit TSS) 33.712 Tj -0 -44.5091 Td -(0681 #define STS_T32B 0xB // Busy 32-bit TSS) 30.702 Tj -0 -45.8182 Td -(0682 #define STS_CG32 0xC // 32-bit Call Gate) 31.304 Tj -0 -47.1272 Td -(0683 #define STS_IG32 0xE // 32-bit Interrupt Gate) 34.314 Tj -0 -48.4363 Td -(0684 #define STS_TG32 0xF // 32-bit Trap Gate) 31.304 Tj -0 -49.7454 Td -(0685 ) 3.01 Tj -0 -51.0545 Td -(0686 // Task state segment format) 19.866 Tj -0 -52.3636 Td -(0687 struct taskstate {) 13.846 Tj -0 -53.6727 Td -(0688 uint link; // Old ts selector) 24.682 Tj -0 -54.9818 Td -(0689 uint esp0; // Stack pointers and segment selectors) 37.324 Tj -0 -56.2909 Td -(0690 ushort ss0; // after an increase in privilege level) 38.528 Tj -0 -57.6 Td -(0691 ushort padding1;) 13.846 Tj -0 -58.9091 Td -(0692 uint *esp1;) 10.836 Tj -0 -60.2181 Td -(0693 ushort ss1;) 10.836 Tj -0 -61.5272 Td -(0694 ushort padding2;) 13.846 Tj -0 -62.8363 Td -(0695 uint *esp2;) 10.836 Tj -0 -64.1454 Td -(0696 ushort ss2;) 10.836 Tj -0 -65.4545 Td -(0697 ushort padding3;) 13.846 Tj -0 -66.7636 Td -(0698 void *cr3; // Page directory base) 26.488 Tj -0 -68.0727 Td -(0699 uint *eip; // Saved state from last task switch) 34.916 Tj -0 -72 Td -(Sheet 06) 4.816 Tj +/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 @@ -5226,7 +5469,10 @@ pdfEndPage %%Page: 14 14 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -5234,241 +5480,276 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mmu.h Page 3) 21.672 Tj -0 -3.92728 Td -(0700 uint eflags;) 11.438 Tj -0 -5.23637 Td -(0701 uint eax; // More saved state \(registers\)) 32.508 Tj -0 -6.54546 Td -(0702 uint ecx;) 9.632 Tj -0 -7.85455 Td -(0703 uint edx;) 9.632 Tj -0 -9.16364 Td -(0704 uint ebx;) 9.632 Tj -0 -10.4727 Td -(0705 uint *esp;) 10.234 Tj -0 -11.7818 Td -(0706 uint *ebp;) 10.234 Tj -0 -13.0909 Td -(0707 uint esi;) 9.632 Tj -0 -14.4 Td -(0708 uint edi;) 9.632 Tj -0 -15.7091 Td -(0709 ushort es; // Even more saved state \(segment selectors\)) 45.15 Tj -0 -17.0182 Td -(0710 ushort padding4;) 13.846 Tj -0 -18.3273 Td -(0711 ushort cs;) 10.234 Tj -0 -19.6364 Td -(0712 ushort padding5;) 13.846 Tj -0 -20.9455 Td -(0713 ushort ss;) 10.234 Tj -0 -22.2545 Td -(0714 ushort padding6;) 13.846 Tj -0 -23.5636 Td -(0715 ushort ds;) 10.234 Tj -0 -24.8727 Td -(0716 ushort padding7;) 13.846 Tj -0 -26.1818 Td -(0717 ushort fs;) 10.234 Tj -0 -27.4909 Td -(0718 ushort padding8;) 13.846 Tj -0 -28.8 Td -(0719 ushort gs;) 10.234 Tj -0 -30.1091 Td -(0720 ushort padding9;) 13.846 Tj -0 -31.4182 Td -(0721 ushort ldt;) 10.836 Tj -0 -32.7273 Td -(0722 ushort padding10;) 14.448 Tj -0 -34.0364 Td -(0723 ushort t; // Trap on task switch) 31.906 Tj -0 -35.3454 Td -(0724 ushort iomb; // I/O map base address) 27.692 Tj -0 -36.6545 Td -(0725 };) 4.214 Tj -0 -37.9636 Td -(0726 ) 3.01 Tj -0 -39.2727 Td -(0727 // Gate descriptors for interrupts and traps) 29.498 Tj -0 -40.5818 Td -(0728 struct gatedesc {) 13.244 Tj -0 -41.8909 Td -(0729 uint off_15_0 : 16; // low 16 bits of offset in segment) 38.528 Tj -0 -43.2 Td -(0730 uint ss : 16; // segment selector) 28.896 Tj -0 -44.5091 Td -(0731 uint args : 5; // # args, 0 for interrupt/trap gates) 39.732 Tj -0 -45.8182 Td -(0732 uint rsv1 : 3; // reserved\(should be zero I guess\)) 38.528 Tj -0 -47.1272 Td -(0733 uint type : 4; // type\(STS_{TG,IG32,TG32}\)) 33.712 Tj -0 -48.4363 Td -(0734 uint s : 1; // must be 0 \(system\)) 30.1 Tj -0 -49.7454 Td -(0735 uint dpl : 2; // descriptor\(meaning new\) privilege level) 42.742 Tj -0 -51.0545 Td -(0736 uint p : 1; // Present) 23.478 Tj -0 -52.3636 Td -(0737 uint off_31_16 : 16; // high bits of offset in segment) 37.324 Tj -0 -53.6727 Td -(0738 };) 4.214 Tj -0 -54.9818 Td -(0739 ) 3.01 Tj -0 -56.2909 Td -(0740 ) 3.01 Tj -0 -57.6 Td -(0741 ) 3.01 Tj -0 -58.9091 Td -(0742 ) 3.01 Tj -0 -60.2181 Td -(0743 ) 3.01 Tj -0 -61.5272 Td -(0744 ) 3.01 Tj -0 -62.8363 Td -(0745 ) 3.01 Tj -0 -64.1454 Td -(0746 ) 3.01 Tj -0 -65.4545 Td -(0747 ) 3.01 Tj -0 -66.7636 Td -(0748 ) 3.01 Tj -0 -68.0727 Td -(0749 ) 3.01 Tj -0 -72 Td -(Sheet 07) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mmu.h Page 4) 21.672 Tj -0 -3.92728 Td -(0750 // Set up a normal interrupt/trap gate descriptor.) 33.11 Tj -0 -5.23637 Td -(0751 // - istrap: 1 for a trap \(= exception\) gate, 0 for an interrupt gate.) 45.15 Tj -0 -6.54546 Td -(0752 // interrupt gate clears FL_IF, trap gate leaves FL_IF alone) 40.334 Tj -0 -7.85455 Td -(0753 // - sel: Code segment selector for interrupt/trap handler) 37.926 Tj -0 -9.16364 Td -(0754 // - off: Offset in code segment for interrupt/trap handler) 38.528 Tj -0 -10.4727 Td -(0755 // - dpl: Descriptor Privilege Level -) 25.886 Tj -0 -11.7818 Td -(0756 // the privilege level required for software to invoke) 39.732 Tj -0 -13.0909 Td -(0757 // this interrupt/trap gate explicitly using an int instruction.) 45.752 Tj -0 -14.4 Td -(0758 #define SETGATE\(gate, istrap, sel, off, d\) \\) 42.14 Tj -0 -15.7091 Td -(0759 { \\) 42.14 Tj -0 -17.0182 Td -(0760 \(gate\).off_15_0 = \(uint\) \(off\) & 0xffff; \\) 38.528 Tj -0 -18.3273 Td -(0761 \(gate\).ss = \(sel\); \\) 38.528 Tj -0 -19.6364 Td -(0762 \(gate\).args = 0; \\) 38.528 Tj -0 -20.9455 Td -(0763 \(gate\).rsv1 = 0; \\) 38.528 Tj -0 -22.2545 Td -(0764 \(gate\).type = \(istrap\) ? STS_TG32 : STS_IG32; \\) 33.712 Tj -0 -23.5636 Td -(0765 \(gate\).s = 0; \\) 33.712 Tj -0 -24.8727 Td -(0766 \(gate\).dpl = \(d\); \\) 38.528 Tj -0 -26.1818 Td -(0767 \(gate\).p = 1; \\) 33.712 Tj -0 -27.4909 Td -(0768 \(gate\).off_31_16 = \(uint\) \(off\) >> 16; \\) 33.712 Tj -0 -28.8 Td -(0769 }) 3.612 Tj -0 -30.1091 Td -(0770 ) 3.01 Tj -0 -31.4182 Td -(0771 ) 3.01 Tj -0 -32.7273 Td -(0772 ) 3.01 Tj -0 -34.0364 Td -(0773 ) 3.01 Tj -0 -35.3454 Td -(0774 ) 3.01 Tj -0 -36.6545 Td -(0775 ) 3.01 Tj -0 -37.9636 Td -(0776 ) 3.01 Tj -0 -39.2727 Td -(0777 ) 3.01 Tj -0 -40.5818 Td -(0778 ) 3.01 Tj -0 -41.8909 Td -(0779 ) 3.01 Tj -0 -43.2 Td -(0780 ) 3.01 Tj -0 -44.5091 Td -(0781 ) 3.01 Tj -0 -45.8182 Td -(0782 ) 3.01 Tj -0 -47.1272 Td -(0783 ) 3.01 Tj -0 -48.4363 Td -(0784 ) 3.01 Tj -0 -49.7454 Td -(0785 ) 3.01 Tj -0 -51.0545 Td -(0786 ) 3.01 Tj -0 -52.3636 Td -(0787 ) 3.01 Tj -0 -53.6727 Td -(0788 ) 3.01 Tj -0 -54.9818 Td -(0789 ) 3.01 Tj -0 -56.2909 Td -(0790 ) 3.01 Tj -0 -57.6 Td -(0791 ) 3.01 Tj -0 -58.9091 Td -(0792 ) 3.01 Tj -0 -60.2181 Td -(0793 ) 3.01 Tj -0 -61.5272 Td -(0794 ) 3.01 Tj -0 -62.8363 Td -(0795 ) 3.01 Tj -0 -64.1454 Td -(0796 ) 3.01 Tj -0 -65.4545 Td -(0797 ) 3.01 Tj -0 -66.7636 Td -(0798 ) 3.01 Tj -0 -68.0727 Td -(0799 ) 3.01 Tj -0 -72 Td -(Sheet 07) 4.816 Tj +/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 @@ -5480,6 +5761,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -5487,241 +5771,254 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/elf.h Page 1) 21.672 Tj -0 -3.92728 Td -(0800 // Format of an ELF executable file) 24.08 Tj -0 -5.23637 Td -(0801 ) 3.01 Tj -0 -6.54546 Td -(0802 #define ELF_MAGIC 0x464C457FU // "\\x7FELF" in little endian) 39.13 Tj -0 -7.85455 Td -(0803 ) 3.01 Tj -0 -9.16364 Td -(0804 // File header) 11.438 Tj -0 -10.4727 Td -(0805 struct elfhdr {) 12.04 Tj -0 -11.7818 Td -(0806 uint magic; // must equal ELF_MAGIC) 25.886 Tj -0 -13.0909 Td -(0807 uchar elf[12];) 12.642 Tj -0 -14.4 Td -(0808 ushort type;) 11.438 Tj -0 -15.7091 Td -(0809 ushort machine;) 13.244 Tj -0 -17.0182 Td -(0810 uint version;) 12.04 Tj -0 -18.3273 Td -(0811 uint entry;) 10.836 Tj -0 -19.6364 Td -(0812 uint phoff;) 10.836 Tj -0 -20.9455 Td -(0813 uint shoff;) 10.836 Tj -0 -22.2545 Td -(0814 uint flags;) 10.836 Tj -0 -23.5636 Td -(0815 ushort ehsize;) 12.642 Tj -0 -24.8727 Td -(0816 ushort phentsize;) 14.448 Tj -0 -26.1818 Td -(0817 ushort phnum;) 12.04 Tj -0 -27.4909 Td -(0818 ushort shentsize;) 14.448 Tj -0 -28.8 Td -(0819 ushort shnum;) 12.04 Tj -0 -30.1091 Td -(0820 ushort shstrndx;) 13.846 Tj -0 -31.4182 Td -(0821 };) 4.214 Tj -0 -32.7273 Td -(0822 ) 3.01 Tj -0 -34.0364 Td -(0823 // Program section header) 18.06 Tj -0 -35.3454 Td -(0824 struct proghdr {) 12.642 Tj -0 -36.6545 Td -(0825 uint type;) 10.234 Tj -0 -37.9636 Td -(0826 uint offset;) 11.438 Tj -0 -39.2727 Td -(0827 uint va;) 9.03 Tj -0 -40.5818 Td -(0828 uint pa;) 9.03 Tj -0 -41.8909 Td -(0829 uint filesz;) 11.438 Tj -0 -43.2 Td -(0830 uint memsz;) 10.836 Tj -0 -44.5091 Td -(0831 uint flags;) 10.836 Tj -0 -45.8182 Td -(0832 uint align;) 10.836 Tj -0 -47.1272 Td -(0833 };) 4.214 Tj -0 -48.4363 Td -(0834 ) 3.01 Tj -0 -49.7454 Td -(0835 // Values for Proghdr type) 18.662 Tj -0 -51.0545 Td -(0836 #define ELF_PROG_LOAD 1) 22.876 Tj -0 -52.3636 Td -(0837 ) 3.01 Tj -0 -53.6727 Td -(0838 // Flag bits for Proghdr flags) 21.07 Tj -0 -54.9818 Td -(0839 #define ELF_PROG_FLAG_EXEC 1) 22.876 Tj -0 -56.2909 Td -(0840 #define ELF_PROG_FLAG_WRITE 2) 22.876 Tj -0 -57.6 Td -(0841 #define ELF_PROG_FLAG_READ 4) 22.876 Tj -0 -58.9091 Td -(0842 ) 3.01 Tj -0 -60.2181 Td -(0843 ) 3.01 Tj -0 -61.5272 Td -(0844 ) 3.01 Tj -0 -62.8363 Td -(0845 ) 3.01 Tj -0 -64.1454 Td -(0846 ) 3.01 Tj -0 -65.4545 Td -(0847 ) 3.01 Tj -0 -66.7636 Td -(0848 ) 3.01 Tj -0 -68.0727 Td -(0849 ) 3.01 Tj -0 -72 Td -(Sheet 08) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mp.h Page 1) 21.07 Tj -0 -3.92728 Td -(0850 // See MultiProcessor Specification Version 1.[14].) 33.712 Tj -0 -5.23637 Td -(0851 ) 3.01 Tj -0 -6.54546 Td -(0852 struct mp { // floating pointer) 28.896 Tj -0 -7.85455 Td -(0853 uchar signature[4]; // "_MP_") 27.692 Tj -0 -9.16364 Td -(0854 void *physaddr; // phys addr of MP config table) 40.936 Tj -0 -10.4727 Td -(0855 uchar length; // 1) 24.682 Tj -0 -11.7818 Td -(0856 uchar specrev; // [14]) 26.488 Tj -0 -13.0909 Td -(0857 uchar checksum; // all bytes must add up to 0) 39.732 Tj -0 -14.4 Td -(0858 uchar type; // MP system config type) 36.722 Tj -0 -15.7091 Td -(0859 uchar imcrp;) 11.438 Tj -0 -17.0182 Td -(0860 uchar reserved[3];) 15.05 Tj -0 -18.3273 Td -(0861 };) 4.214 Tj -0 -19.6364 Td -(0862 ) 3.01 Tj -0 -20.9455 Td -(0863 struct mpctb { // configuration table header) 34.916 Tj -0 -22.2545 Td -(0864 uchar signature[4]; // "PCMP") 27.692 Tj -0 -23.5636 Td -(0865 ushort length; // total table length) 34.916 Tj -0 -24.8727 Td -(0866 uchar version; // [14]) 26.488 Tj -0 -26.1818 Td -(0867 uchar checksum; // all bytes must add up to 0) 39.732 Tj -0 -27.4909 Td -(0868 uchar product[20]; // product id) 30.1 Tj -0 -28.8 Td -(0869 uint *oemtable; // OEM table pointer) 34.314 Tj -0 -30.1091 Td -(0870 ushort oemlength; // OEM table length) 33.712 Tj -0 -31.4182 Td -(0871 ushort entry; // entry count) 30.702 Tj -0 -32.7273 Td -(0872 uint *lapicaddr; // address of local APIC) 36.722 Tj -0 -34.0364 Td -(0873 ushort xlength; // extended table length) 36.722 Tj -0 -35.3454 Td -(0874 uchar xchecksum; // extended table checksum) 37.926 Tj -0 -36.6545 Td -(0875 uchar reserved;) 13.244 Tj -0 -37.9636 Td -(0876 };) 4.214 Tj -0 -39.2727 Td -(0877 ) 3.01 Tj -0 -40.5818 Td -(0878 struct mppe { // processor table entry) 31.906 Tj -0 -41.8909 Td -(0879 uchar type; // entry type \(0\)) 32.508 Tj -0 -43.2 Td -(0880 uchar apicid; // local APIC id) 31.906 Tj -0 -44.5091 Td -(0881 uchar version; // local APIC verison) 34.916 Tj -0 -45.8182 Td -(0882 uchar flags; // CPU flags) 29.498 Tj -0 -47.1272 Td -(0883 uchar signature[4]; // CPU signature) 31.906 Tj -0 -48.4363 Td -(0884 uint feature; // feature flags from CPUID instruction) 45.752 Tj -0 -49.7454 Td -(0885 uchar reserved[8];) 15.05 Tj -0 -51.0545 Td -(0886 };) 4.214 Tj -0 -52.3636 Td -(0887 ) 3.01 Tj -0 -53.6727 Td -(0888 struct mpbe { // bus table entry) 28.294 Tj -0 -54.9818 Td -(0889 uchar type; // entry type \(1\)) 32.508 Tj -0 -56.2909 Td -(0890 uchar busno; // bus id) 27.692 Tj -0 -57.6 Td -(0891 char string[6]; // bus type string) 33.11 Tj -0 -58.9091 Td -(0892 };) 4.214 Tj -0 -60.2181 Td -(0893 ) 3.01 Tj -0 -61.5272 Td -(0894 ) 3.01 Tj -0 -62.8363 Td -(0895 ) 3.01 Tj -0 -64.1454 Td -(0896 ) 3.01 Tj -0 -65.4545 Td -(0897 ) 3.01 Tj -0 -66.7636 Td -(0898 ) 3.01 Tj -0 -68.0727 Td -(0899 ) 3.01 Tj -0 -72 Td -(Sheet 08) 4.816 Tj +/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 @@ -5732,7 +6029,10 @@ pdfEndPage %%Page: 16 16 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -5740,241 +6040,269 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mp.h Page 2) 21.07 Tj -0 -3.92728 Td -(0900 struct mpioapic { // I/O APIC table entry) 31.304 Tj -0 -5.23637 Td -(0901 uchar type; // entry type \(2\)) 32.508 Tj -0 -6.54546 Td -(0902 uchar apicno; // I/O APIC id) 30.702 Tj -0 -7.85455 Td -(0903 uchar version; // I/O APIC version) 33.712 Tj -0 -9.16364 Td -(0904 uchar flags; // I/O APIC flags) 32.508 Tj -0 -10.4727 Td -(0905 uint *addr; // I/O APIC address) 33.11 Tj -0 -11.7818 Td -(0906 };) 4.214 Tj -0 -13.0909 Td -(0907 ) 3.01 Tj -0 -14.4 Td -(0908 struct mpie { // interrupt table entry) 31.906 Tj -0 -15.7091 Td -(0909 uchar type; // entry type \([34]\)) 34.314 Tj -0 -17.0182 Td -(0910 uchar intr; // interrupt type) 32.508 Tj -0 -18.3273 Td -(0911 ushort flags; // interrupt flag) 32.508 Tj -0 -19.6364 Td -(0912 uchar busno; // source bus id) 31.906 Tj -0 -20.9455 Td -(0913 uchar irq; // source bus irq) 32.508 Tj -0 -22.2545 Td -(0914 uchar apicno; // destination APIC id) 35.518 Tj -0 -23.5636 Td -(0915 uchar intin; // destination APIC [L]INTIN#) 39.732 Tj -0 -24.8727 Td -(0916 };) 4.214 Tj -0 -26.1818 Td -(0917 ) 3.01 Tj -0 -27.4909 Td -(0918 enum { // table entry types) 29.498 Tj -0 -28.8 Td -(0919 MPPROCESSOR = 0x00, // one entry per processor) 37.926 Tj -0 -30.1091 Td -(0920 MPBUS = 0x01, // one entry per bus) 34.314 Tj -0 -31.4182 Td -(0921 MPIOAPIC = 0x02, // one entry per I/O APIC) 37.324 Tj -0 -32.7273 Td -(0922 MPIOINTR = 0x03, // one entry per bus interrupt source) 44.548 Tj -0 -34.0364 Td -(0923 MPLINTR = 0x04, // one entry per system interrupt source) 46.354 Tj -0 -35.3454 Td -(0924 ) 3.01 Tj -0 -36.6545 Td -(0925 MPSASM = 0x80,) 12.642 Tj -0 -37.9636 Td -(0926 MPHIERARCHY = 0x81,) 16.856 Tj -0 -39.2727 Td -(0927 MPCBASM = 0x82,) 13.244 Tj -0 -40.5818 Td -(0928 ) 3.01 Tj -0 -41.8909 Td -(0929 // PCMPprocessor and PCMPioapic flags) 39.732 Tj -0 -43.2 Td -(0930 MPEN = 0x01, // enabled) 28.294 Tj -0 -44.5091 Td -(0931 MPBP = 0x02, // bootstrap processor) 35.518 Tj -0 -45.8182 Td -(0932 ) 3.01 Tj -0 -47.1272 Td -(0933 // PCMPiointr and PCMPlintr flags) 37.324 Tj -0 -48.4363 Td -(0934 MPPOMASK = 0x03, // polarity conforms to bus specs) 42.14 Tj -0 -49.7454 Td -(0935 MPHIGH = 0x01, // active high) 30.702 Tj -0 -51.0545 Td -(0936 MPLOW = 0x03, // active low) 30.1 Tj -0 -52.3636 Td -(0937 MPELMASK = 0x0C, // trigger mode of APIC input signals) 44.548 Tj -0 -53.6727 Td -(0938 MPEDGE = 0x04, // edge-triggered) 32.508 Tj -0 -54.9818 Td -(0939 MPLEVEL = 0x0C, // level-triggered) 33.11 Tj -0 -56.2909 Td -(0940 ) 3.01 Tj -0 -57.6 Td -(0941 // PCMPiointr and PCMPlintr interrupt type) 42.742 Tj -0 -58.9091 Td -(0942 MPINT = 0x00, // vectored interrupt from APIC Rdt) 43.344 Tj -0 -60.2181 Td -(0943 MPNMI = 0x01, // non-maskable interrupt) 37.324 Tj -0 -61.5272 Td -(0944 MPSMI = 0x02, // system management interrupt) 40.334 Tj -0 -62.8363 Td -(0945 MPExtINT = 0x03, // vectored interrupt from external PIC) 45.752 Tj -0 -64.1454 Td -(0946 };) 4.214 Tj -0 -65.4545 Td -(0947 ) 3.01 Tj -0 -66.7636 Td -(0948 ) 3.01 Tj -0 -68.0727 Td -(0949 ) 3.01 Tj -0 -72 Td -(Sheet 09) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mp.h Page 3) 21.07 Tj -0 -3.92728 Td -(0950 // Common bits for) 13.846 Tj -0 -5.23637 Td -(0951 // I/O APIC Redirection Table Entry;) 27.692 Tj -0 -6.54546 Td -(0952 // Local APIC Local Interrupt Vector Table;) 31.906 Tj -0 -7.85455 Td -(0953 // Local APIC Inter-Processor Interrupt;) 30.1 Tj -0 -9.16364 Td -(0954 // Local APIC Timer Vector Table.) 25.886 Tj -0 -10.4727 Td -(0955 enum {) 6.622 Tj -0 -11.7818 Td -(0956 APIC_FIXED = 0x00000000, // [10:8] Delivery Mode) 36.12 Tj -0 -13.0909 Td -(0957 APIC_LOWEST = 0x00000100, // Lowest priority) 33.11 Tj -0 -14.4 Td -(0958 APIC_SMI = 0x00000200, // System Management Interrupt) 40.334 Tj -0 -15.7091 Td -(0959 APIC_RR = 0x00000300, // Remote Read) 30.702 Tj -0 -17.0182 Td -(0960 APIC_NMI = 0x00000400,) 21.07 Tj -0 -18.3273 Td -(0961 APIC_INIT = 0x00000500, // INIT/RESET) 30.1 Tj -0 -19.6364 Td -(0962 APIC_STARTUP = 0x00000600, // Startup IPI) 30.702 Tj -0 -20.9455 Td -(0963 APIC_EXTINT = 0x00000700,) 21.07 Tj -0 -22.2545 Td -(0964 ) 3.01 Tj -0 -23.5636 Td -(0965 APIC_PHYSICAL = 0x00000000, // [11] Destination Mode \(RW\)) 39.732 Tj -0 -24.8727 Td -(0966 APIC_LOGICAL = 0x00000800,) 21.07 Tj -0 -26.1818 Td -(0967 ) 3.01 Tj -0 -27.4909 Td -(0968 APIC_DELIVS = 0x00001000, // [12] Delivery Status \(RO\)) 39.13 Tj -0 -28.8 Td -(0969 APIC_HIGH = 0x00000000, // [13] Interrupt Input Pin Polarity \(RW\)) 46.956 Tj -0 -30.1091 Td -(0970 APIC_LOW = 0x00002000,) 21.07 Tj -0 -31.4182 Td -(0971 APIC_REMOTEIRR = 0x00004000, // [14] Remote IRR \(RO\)) 36.12 Tj -0 -32.7273 Td -(0972 APIC_EDGE = 0x00000000, // [15] Trigger Mode \(RW\)) 37.324 Tj -0 -34.0364 Td -(0973 APIC_LEVEL = 0x00008000,) 21.07 Tj -0 -35.3454 Td -(0974 APIC_IMASK = 0x00010000, // [16] Interrupt Mask) 35.518 Tj -0 -36.6545 Td -(0975 };) 4.214 Tj -0 -37.9636 Td -(0976 ) 3.01 Tj -0 -39.2727 Td -(0977 ) 3.01 Tj -0 -40.5818 Td -(0978 ) 3.01 Tj -0 -41.8909 Td -(0979 ) 3.01 Tj -0 -43.2 Td -(0980 ) 3.01 Tj -0 -44.5091 Td -(0981 ) 3.01 Tj -0 -45.8182 Td -(0982 ) 3.01 Tj -0 -47.1272 Td -(0983 ) 3.01 Tj -0 -48.4363 Td -(0984 ) 3.01 Tj -0 -49.7454 Td -(0985 ) 3.01 Tj -0 -51.0545 Td -(0986 ) 3.01 Tj -0 -52.3636 Td -(0987 ) 3.01 Tj -0 -53.6727 Td -(0988 ) 3.01 Tj -0 -54.9818 Td -(0989 ) 3.01 Tj -0 -56.2909 Td -(0990 ) 3.01 Tj -0 -57.6 Td -(0991 ) 3.01 Tj -0 -58.9091 Td -(0992 ) 3.01 Tj -0 -60.2181 Td -(0993 ) 3.01 Tj -0 -61.5272 Td -(0994 ) 3.01 Tj -0 -62.8363 Td -(0995 ) 3.01 Tj -0 -64.1454 Td -(0996 ) 3.01 Tj -0 -65.4545 Td -(0997 ) 3.01 Tj -0 -66.7636 Td -(0998 ) 3.01 Tj -0 -68.0727 Td -(0999 ) 3.01 Tj -0 -72 Td -(Sheet 09) 4.816 Tj +/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 @@ -5986,6 +6314,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -5993,241 +6324,268 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/bootasm.S Page 1) 24.08 Tj -0 -3.92728 Td -(1000 #include "asm.h") 12.642 Tj -0 -5.23637 Td -(1001 ) 3.01 Tj -0 -6.54546 Td -(1002 .set PROT_MODE_CSEG,0x8 # code segment selector) 36.12 Tj -0 -7.85455 Td -(1003 .set PROT_MODE_DSEG,0x10 # data segment selector) 36.12 Tj -0 -9.16364 Td -(1004 .set CR0_PE_ON,0x1 # protected mode enable flag) 39.13 Tj -0 -10.4727 Td -(1005 ) 3.01 Tj -0 -11.7818 Td -(1006 #########################################################################) 46.956 Tj -0 -13.0909 Td -(1007 # ENTRY POINT for the bootstrap processor) 27.692 Tj -0 -14.4 Td -(1008 # This code should be stored in the first sector of the hard disk.) 43.946 Tj -0 -15.7091 Td -(1009 # After the BIOS initializes the hardware on startup or system reset,) 45.752 Tj -0 -17.0182 Td -(1010 # it loads this code at physical address 0x7c00 - 0x7d00 \(512 bytes\).) 45.752 Tj -0 -18.3273 Td -(1011 # Then the BIOS jumps to the beginning of it, address 0x7c00,) 40.936 Tj -0 -19.6364 Td -(1012 # while running in 16-bit real-mode \(8086 compatibility mode\).) 41.538 Tj -0 -20.9455 Td -(1013 # The Code Segment register \(CS\) is initially zero on entry.) 40.334 Tj -0 -22.2545 Td -(1014 #) 3.612 Tj -0 -23.5636 Td -(1015 # This code switches into 32-bit protected mode so that all of) 40.334 Tj -0 -24.8727 Td -(1016 # memory can accessed, then calls into C.) 27.692 Tj -0 -26.1818 Td -(1017 #########################################################################) 46.956 Tj -0 -27.4909 Td -(1018 ) 3.01 Tj -0 -28.8 Td -(1019 .globl start # Entry point) 31.304 Tj -0 -30.1091 Td -(1020 start:) 6.622 Tj -0 -31.4182 Td -(1021 .code16 # This runs in real mode) 37.926 Tj -0 -32.7273 Td -(1022 cli # Disable interrupts) 35.518 Tj -0 -34.0364 Td -(1023 cld # String operations increment) 40.936 Tj -0 -35.3454 Td -(1024 ) 3.01 Tj -0 -36.6545 Td -(1025 # Set up the important data segment registers \(DS, ES, SS\).) 39.732 Tj -0 -37.9636 Td -(1026 xorw %ax,%ax # Segment number zero) 36.12 Tj -0 -39.2727 Td -(1027 movw %ax,%ds # -> Data Segment) 33.712 Tj -0 -40.5818 Td -(1028 movw %ax,%es # -> Extra Segment) 34.314 Tj -0 -41.8909 Td -(1029 movw %ax,%ss # -> Stack Segment) 34.314 Tj -0 -43.2 Td -(1030 ) 3.01 Tj -0 -44.5091 Td -(1031 # Set up the stack pointer, growing downward from 0x7c00.) 38.528 Tj -0 -45.8182 Td -(1032 movw $start,%sp # Stack Pointer) 32.508 Tj -0 -47.1272 Td -(1033 ) 3.01 Tj -0 -48.4363 Td -(1034 # Enable A20:) 12.04 Tj -0 -49.7454 Td -(1035 # For fascinating historical reasons \(related to the fact that) 42.742 Tj -0 -51.0545 Td -(1036 # the earliest 8086-based PCs could only address 1MB of physical) 43.946 Tj -0 -52.3636 Td -(1037 # memory and subsequent 80286-based PCs wanted to retain maximum) 43.946 Tj -0 -53.6727 Td -(1038 # compatibility\), physical address line 20 is tied to low when the) 45.15 Tj -0 -54.9818 Td -(1039 # machine boots. Obviously this a bit of a drag for us, especially) 45.752 Tj -0 -56.2909 Td -(1040 # when trying to address memory above 1MB. This code undoes this.) 45.15 Tj -0 -57.6 Td -(1041 ) 3.01 Tj -0 -58.9091 Td -(1042 seta20.1:) 8.428 Tj -0 -60.2181 Td -(1043 inb $0x64,%al # Get status) 30.702 Tj -0 -61.5272 Td -(1044 testb $0x2,%al # Busy?) 27.692 Tj -0 -62.8363 Td -(1045 jnz seta20.1 # Yes) 26.488 Tj -0 -64.1454 Td -(1046 movb $0xd1,%al # Command: Write) 33.11 Tj -0 -65.4545 Td -(1047 outb %al,$0x64 # output port) 31.906 Tj -0 -66.7636 Td -(1048 ) 3.01 Tj -0 -68.0727 Td -(1049 ) 3.01 Tj -0 -72 Td -(Sheet 10) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/bootasm.S Page 2) 24.08 Tj -0 -3.92728 Td -(1050 seta20.2:) 8.428 Tj -0 -5.23637 Td -(1051 inb $0x64,%al # Get status) 30.702 Tj -0 -6.54546 Td -(1052 testb $0x2,%al # Busy?) 27.692 Tj -0 -7.85455 Td -(1053 jnz seta20.2 # Yes) 26.488 Tj -0 -9.16364 Td -(1054 movb $0xdf,%al # Enable) 28.294 Tj -0 -10.4727 Td -(1055 outb %al,$0x60 # A20) 27.09 Tj -0 -11.7818 Td -(1056 ) 3.01 Tj -0 -13.0909 Td -(1057 # Switch from real to protected mode) 24.682 Tj -0 -14.4 Td -(1058 # The descriptors in our GDT allow all physical memory to be accessed.) 45.752 Tj -0 -15.7091 Td -(1059 # Furthermore, the descriptors have base addresses of 0, so that the) 44.548 Tj -0 -17.0182 Td -(1060 # segment translation is a NOP, ie. virtual addresses are identical to) 45.752 Tj -0 -18.3273 Td -(1061 # their physical addresses. With this setup, immediately after) 41.538 Tj -0 -19.6364 Td -(1062 # enabling protected mode it will still appear to this code) 39.13 Tj -0 -20.9455 Td -(1063 # that it is running directly on physical memory with no translation.) 45.15 Tj -0 -22.2545 Td -(1064 # This initial NOP-translation setup is required by the processor) 42.742 Tj -0 -23.5636 Td -(1065 # to ensure that the transition to protected mode occurs smoothly.) 43.344 Tj -0 -24.8727 Td -(1066 real_to_prot:) 10.836 Tj -0 -26.1818 Td -(1067 cli # Mandatory since we dont set up an IDT) 44.548 Tj -0 -27.4909 Td -(1068 lgdt gdtdesc # load GDT -- mandatory in protected mode) 45.752 Tj -0 -28.8 Td -(1069 movl %cr0, %eax # turn on protected mode) 35.518 Tj -0 -30.1091 Td -(1070 orl $CR0_PE_ON, %eax #) 21.672 Tj -0 -31.4182 Td -(1071 movl %eax, %cr0 #) 21.672 Tj -0 -32.7273 Td -(1072 ### CPU magic: jump to relocation, flush prefetch queue, and reload %cs) 46.956 Tj -0 -34.0364 Td -(1073 ### Has the effect of just jmp to the next instruction, but simultaneous) 47.558 Tj -0 -35.3454 Td -(1074 ### loads CS with $PROT_MODE_CSEG.) 24.682 Tj -0 -36.6545 Td -(1075 ljmp $PROT_MODE_CSEG, $protcseg) 24.682 Tj -0 -37.9636 Td -(1076 ) 3.01 Tj -0 -39.2727 Td -(1077 #### we are in 32-bit protected mode \(hence the .code32\)) 36.722 Tj -0 -40.5818 Td -(1078 .code32) 7.224 Tj -0 -41.8909 Td -(1079 protcseg:) 8.428 Tj -0 -43.2 Td -(1080 # Set up the protected-mode data segment registers) 34.314 Tj -0 -44.5091 Td -(1081 movw $PROT_MODE_DSEG, %ax # Our data segment selector) 39.732 Tj -0 -45.8182 Td -(1082 movw %ax, %ds # -> DS: Data Segment) 36.12 Tj -0 -47.1272 Td -(1083 movw %ax, %es # -> ES: Extra Segment) 36.722 Tj -0 -48.4363 Td -(1084 movw %ax, %fs # -> FS) 27.692 Tj -0 -49.7454 Td -(1085 movw %ax, %gs # -> GS) 27.692 Tj -0 -51.0545 Td -(1086 movw %ax, %ss # -> SS: Stack Segment) 36.722 Tj -0 -52.3636 Td -(1087 call cmain # finish the boot load from C.) 41.538 Tj -0 -53.6727 Td -(1088 # cmain\(\) should not return) 39.732 Tj -0 -54.9818 Td -(1089 spin:) 6.02 Tj -0 -56.2909 Td -(1090 jmp spin # ..but in case it does, spin) 40.936 Tj -0 -57.6 Td -(1091 ) 3.01 Tj -0 -58.9091 Td -(1092 .p2align 2 # force 4 byte alignment) 42.742 Tj -0 -60.2181 Td -(1093 gdt:) 5.418 Tj -0 -61.5272 Td -(1094 SEG_NULLASM # null seg) 34.314 Tj -0 -62.8363 Td -(1095 SEG_ASM\(STA_X|STA_R, 0x0, 0xffffffff\) # code seg) 34.314 Tj -0 -64.1454 Td -(1096 SEG_ASM\(STA_W, 0x0, 0xffffffff\) # data seg) 34.314 Tj -0 -65.4545 Td -(1097 gdtdesc:) 7.826 Tj -0 -66.7636 Td -(1098 .word 0x17 # sizeof\(gdt\) - 1) 38.528 Tj -0 -68.0727 Td -(1099 .long gdt # address gdt) 36.12 Tj -0 -72 Td -(Sheet 10) 4.816 Tj +/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 @@ -6238,7 +6596,10 @@ pdfEndPage %%Page: 18 18 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -6246,241 +6607,261 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/bootother.S Page 1) 25.284 Tj -0 -3.92728 Td -(1100 #include "asm.h") 12.642 Tj -0 -5.23637 Td -(1101 ) 3.01 Tj -0 -6.54546 Td -(1102 # Start an Application Processor. This must be placed on a 4KB boundary) 45.752 Tj -0 -7.85455 Td -(1103 # somewhere in the 1st MB of conventional memory \(APBOOTSTRAP\). However,) 46.354 Tj -0 -9.16364 Td -(1104 # due to some shortcuts below it's restricted further to within the 1st) 45.752 Tj -0 -10.4727 Td -(1105 # 64KB. The AP starts in real-mode, with) 27.09 Tj -0 -11.7818 Td -(1106 # CS selector set to the startup memory address/16;) 34.916 Tj -0 -13.0909 Td -(1107 # CS base set to startup memory address;) 28.294 Tj -0 -14.4 Td -(1108 # CS limit set to 64KB;) 18.06 Tj -0 -15.7091 Td -(1109 # CPL and IP set to 0.) 17.458 Tj -0 -17.0182 Td -(1110 #) 3.612 Tj -0 -18.3273 Td -(1111 # mp.c causes each non-boot CPU in turn to jump to start.) 37.324 Tj -0 -19.6364 Td -(1112 # mp.c puts the correct %esp in start-4, and the place to jump) 40.334 Tj -0 -20.9455 Td -(1113 # to in start-8.) 12.642 Tj -0 -22.2545 Td -(1114 ) 3.01 Tj -0 -23.5636 Td -(1115 .set PROT_MODE_CSEG,0x8 # code segment selector) 36.12 Tj -0 -24.8727 Td -(1116 .set PROT_MODE_DSEG,0x10 # data segment selector) 36.12 Tj -0 -26.1818 Td -(1117 .set CR0_PE_ON,0x1 # protected mode enable flag) 39.13 Tj -0 -27.4909 Td -(1118 ) 3.01 Tj -0 -28.8 Td -(1119 .globl start) 10.234 Tj -0 -30.1091 Td -(1120 start:) 6.622 Tj -0 -31.4182 Td -(1121 .code16 # This runs in real mode) 35.518 Tj -0 -32.7273 Td -(1122 cli # Disable interrupts) 33.11 Tj -0 -34.0364 Td -(1123 cld # String operations increment) 38.528 Tj -0 -35.3454 Td -(1124 ) 3.01 Tj -0 -36.6545 Td -(1125 # Set up the important data segment registers \(DS, ES, SS\).) 39.732 Tj -0 -37.9636 Td -(1126 xorw %ax,%ax # Segment number zero) 33.712 Tj -0 -39.2727 Td -(1127 movw %ax,%ds # -> Data Segment) 31.304 Tj -0 -40.5818 Td -(1128 movw %ax,%es # -> Extra Segment) 31.906 Tj -0 -41.8909 Td -(1129 movw %ax,%ss # -> Stack Segment) 31.906 Tj -0 -43.2 Td -(1130 ) 3.01 Tj -0 -44.5091 Td -(1131 # Set up the stack pointer, growing downward from 0x7000-8.) 39.732 Tj -0 -45.8182 Td -(1132 movw $start-8,%sp # Stack Pointer) 30.1 Tj -0 -47.1272 Td -(1133 ) 3.01 Tj -0 -48.4363 Td -(1134 # Switch from real to protected mode) 25.886 Tj -0 -49.7454 Td -(1135 # The descriptors in our GDT allow all physical memory to be accessed.) 46.956 Tj -0 -51.0545 Td -(1136 # Furthermore, the descriptors have base addresses of 0, so that the) 45.752 Tj -0 -52.3636 Td -(1137 # segment translation is a NOP, ie. virtual addresses are identical to) 46.956 Tj -0 -53.6727 Td -(1138 # their physical addresses. With this setup, immediately after) 42.742 Tj -0 -54.9818 Td -(1139 # enabling protected mode it will still appear to this code) 40.334 Tj -0 -56.2909 Td -(1140 # that it is running directly on physical memory with no translation.) 46.354 Tj -0 -57.6 Td -(1141 # This initial NOP-translation setup is required by the processor) 43.946 Tj -0 -58.9091 Td -(1142 # to ensure that the transition to protected mode occurs smoothly.) 44.548 Tj -0 -60.2181 Td -(1143 ) 3.01 Tj -0 -61.5272 Td -(1144 lgdt gdtdesc # load GDT -- mandatory in protected mode) 45.752 Tj -0 -62.8363 Td -(1145 movl %cr0, %eax # turn on protected mode) 35.518 Tj -0 -64.1454 Td -(1146 orl $CR0_PE_ON, %eax #) 21.672 Tj -0 -65.4545 Td -(1147 movl %eax, %cr0 #) 21.672 Tj -0 -66.7636 Td -(1148 ) 3.01 Tj -0 -68.0727 Td -(1149 ) 3.01 Tj -0 -72 Td -(Sheet 11) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/bootother.S Page 2) 25.284 Tj -0 -3.92728 Td -(1150 # CPU magic: jump to relocation, flush prefetch queue, and reload %cs) 45.752 Tj -0 -5.23637 Td -(1151 # Has the effect of just jmp to the next instruction, but simultaneous) 46.354 Tj -0 -6.54546 Td -(1152 # loads CS with $PROT_MODE_CSEG.) 23.478 Tj -0 -7.85455 Td -(1153 ljmp $PROT_MODE_CSEG, $protcseg) 24.682 Tj -0 -9.16364 Td -(1154 ) 3.01 Tj -0 -10.4727 Td -(1155 # We are now in 32-bit protected mode \(hence the .code32\)) 37.324 Tj -0 -11.7818 Td -(1156 .code32) 7.224 Tj -0 -13.0909 Td -(1157 protcseg:) 8.428 Tj -0 -14.4 Td -(1158 # Set up the protected-mode data segment registers) 34.314 Tj -0 -15.7091 Td -(1159 movw $PROT_MODE_DSEG, %ax # Our data segment selector) 39.732 Tj -0 -17.0182 Td -(1160 movw %ax, %ds # -> DS: Data Segment) 36.12 Tj -0 -18.3273 Td -(1161 movw %ax, %es # -> ES: Extra Segment) 36.722 Tj -0 -19.6364 Td -(1162 movw %ax, %fs # -> FS) 27.692 Tj -0 -20.9455 Td -(1163 movw %ax, %gs # -> GS) 27.692 Tj -0 -22.2545 Td -(1164 movw %ax, %ss # -> SS: Stack Segment) 36.722 Tj -0 -23.5636 Td -(1165 ) 3.01 Tj -0 -24.8727 Td -(1166 movl start-8, %eax) 16.856 Tj -0 -26.1818 Td -(1167 movl start-4, %esp) 16.856 Tj -0 -27.4909 Td -(1168 jmp *%eax) 12.04 Tj -0 -28.8 Td -(1169 ) 3.01 Tj -0 -30.1091 Td -(1170 .p2align 2 # force 4 byte alignment) 42.742 Tj -0 -31.4182 Td -(1171 gdt:) 5.418 Tj -0 -32.7273 Td -(1172 SEG_NULLASM # null seg) 34.314 Tj -0 -34.0364 Td -(1173 SEG_ASM\(STA_X|STA_R, 0x0, 0xffffffff\) # code seg) 34.314 Tj -0 -35.3454 Td -(1174 SEG_ASM\(STA_W, 0x0, 0xffffffff\) # data seg) 34.314 Tj -0 -36.6545 Td -(1175 ) 3.01 Tj -0 -37.9636 Td -(1176 gdtdesc:) 7.826 Tj -0 -39.2727 Td -(1177 .word 0x17 # sizeof\(gdt\) - 1) 38.528 Tj -0 -40.5818 Td -(1178 .long gdt # address gdt) 36.12 Tj -0 -41.8909 Td -(1179 ) 3.01 Tj -0 -43.2 Td -(1180 ) 3.01 Tj -0 -44.5091 Td -(1181 ) 3.01 Tj -0 -45.8182 Td -(1182 ) 3.01 Tj -0 -47.1272 Td -(1183 ) 3.01 Tj -0 -48.4363 Td -(1184 ) 3.01 Tj -0 -49.7454 Td -(1185 ) 3.01 Tj -0 -51.0545 Td -(1186 ) 3.01 Tj -0 -52.3636 Td -(1187 ) 3.01 Tj -0 -53.6727 Td -(1188 ) 3.01 Tj -0 -54.9818 Td -(1189 ) 3.01 Tj -0 -56.2909 Td -(1190 ) 3.01 Tj -0 -57.6 Td -(1191 ) 3.01 Tj -0 -58.9091 Td -(1192 ) 3.01 Tj -0 -60.2181 Td -(1193 ) 3.01 Tj -0 -61.5272 Td -(1194 ) 3.01 Tj -0 -62.8363 Td -(1195 ) 3.01 Tj -0 -64.1454 Td -(1196 ) 3.01 Tj -0 -65.4545 Td -(1197 ) 3.01 Tj -0 -66.7636 Td -(1198 ) 3.01 Tj -0 -68.0727 Td -(1199 ) 3.01 Tj -0 -72 Td -(Sheet 11) 4.816 Tj +/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 @@ -6492,6 +6873,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -6499,241 +6883,257 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/main.c Page 1) 22.274 Tj -0 -3.92728 Td -(1200 #include "types.h") 13.846 Tj -0 -5.23637 Td -(1201 #include "param.h") 13.846 Tj -0 -6.54546 Td -(1202 #include "mmu.h") 12.642 Tj -0 -7.85455 Td -(1203 #include "proc.h") 13.244 Tj -0 -9.16364 Td -(1204 #include "defs.h") 13.244 Tj -0 -10.4727 Td -(1205 #include "x86.h") 12.642 Tj -0 -11.7818 Td -(1206 #include "traps.h") 13.846 Tj -0 -13.0909 Td -(1207 #include "syscall.h") 15.05 Tj -0 -14.4 Td -(1208 #include "elf.h") 12.642 Tj -0 -15.7091 Td -(1209 #include "param.h") 13.846 Tj -0 -17.0182 Td -(1210 #include "spinlock.h") 15.652 Tj -0 -18.3273 Td -(1211 ) 3.01 Tj -0 -19.6364 Td -(1212 extern char edata[], end[];) 19.264 Tj -0 -20.9455 Td -(1213 extern uchar _binary__init_start[], _binary__init_size[];) 37.324 Tj -0 -22.2545 Td -(1214 ) 3.01 Tj -0 -23.5636 Td -(1215 void process0\(\);) 12.642 Tj -0 -24.8727 Td -(1216 ) 3.01 Tj -0 -26.1818 Td -(1217 // Bootstrap processor starts running C code here.) 33.11 Tj -0 -27.4909 Td -(1218 // This is called main0 not main so that it can have) 34.314 Tj -0 -28.8 Td -(1219 // a void return type. Gcc can't handle functions named) 36.722 Tj -0 -30.1091 Td -(1220 // main that don't return int. Really.) 26.488 Tj -0 -31.4182 Td -(1221 void) 5.418 Tj -0 -32.7273 Td -(1222 main0\(void\)) 9.632 Tj -0 -34.0364 Td -(1223 {) 3.612 Tj -0 -35.3454 Td -(1224 int i;) 7.826 Tj -0 -36.6545 Td -(1225 int bcpu;) 9.632 Tj -0 -37.9636 Td -(1226 struct proc *p;) 13.244 Tj -0 -39.2727 Td -(1227 ) 3.01 Tj -0 -40.5818 Td -(1228 // clear BSS) 11.438 Tj -0 -41.8909 Td -(1229 memset\(edata, 0, end - edata\);) 22.274 Tj -0 -43.2 Td -(1230 ) 3.01 Tj -0 -44.5091 Td -(1231 // Prevent release\(\) from enabling interrupts.) 31.906 Tj -0 -45.8182 Td -(1232 for\(i=0; istate = RUNNABLE;) 16.254 Tj -0 -20.9455 Td -(1263 p->kstack = kalloc\(KSTACKSIZE\);) 22.876 Tj -0 -22.2545 Td -(1264 ) 3.01 Tj -0 -23.5636 Td -(1265 // cause proc[0] to start in kernel at process0) 32.508 Tj -0 -24.8727 Td -(1266 p->jmpbuf.eip = \(uint\) process0;) 23.478 Tj -0 -26.1818 Td -(1267 p->jmpbuf.esp = \(uint\) \(p->kstack + KSTACKSIZE - 4\);) 35.518 Tj -0 -27.4909 Td -(1268 ) 3.01 Tj -0 -28.8 Td -(1269 // make sure there's a TSS) 19.866 Tj -0 -30.1091 Td -(1270 setupsegs\(0\);) 12.04 Tj -0 -31.4182 Td -(1271 ) 3.01 Tj -0 -32.7273 Td -(1272 // initialize I/O devices, let them enable interrupts) 36.12 Tj -0 -34.0364 Td -(1273 console_init\(\);) 13.244 Tj -0 -35.3454 Td -(1274 ide_init\(\);) 10.836 Tj -0 -36.6545 Td -(1275 ) 3.01 Tj -0 -37.9636 Td -(1276 // start other CPUs) 15.652 Tj -0 -39.2727 Td -(1277 mp_startthem\(\);) 13.244 Tj -0 -40.5818 Td -(1278 ) 3.01 Tj -0 -41.8909 Td -(1279 // turn on timer) 13.846 Tj -0 -43.2 Td -(1280 if\(ismp\)) 9.03 Tj -0 -44.5091 Td -(1281 lapic_timerinit\(\);) 16.254 Tj -0 -45.8182 Td -(1282 else) 6.622 Tj -0 -47.1272 Td -(1283 pit8253_timerinit\(\);) 17.458 Tj -0 -48.4363 Td -(1284 ) 3.01 Tj -0 -49.7454 Td -(1285 // enable interrupts on the local APIC) 27.09 Tj -0 -51.0545 Td -(1286 lapic_enableintr\(\);) 15.652 Tj -0 -52.3636 Td -(1287 ) 3.01 Tj -0 -53.6727 Td -(1288 // enable interrupts on this processor.) 27.692 Tj -0 -54.9818 Td -(1289 cpus[cpu\(\)].nlock--;) 16.254 Tj -0 -56.2909 Td -(1290 sti\(\);) 7.826 Tj -0 -57.6 Td -(1291 ) 3.01 Tj -0 -58.9091 Td -(1292 scheduler\(\);) 11.438 Tj -0 -60.2181 Td -(1293 }) 3.612 Tj -0 -61.5272 Td -(1294 ) 3.01 Tj -0 -62.8363 Td -(1295 ) 3.01 Tj -0 -64.1454 Td -(1296 ) 3.01 Tj -0 -65.4545 Td -(1297 ) 3.01 Tj -0 -66.7636 Td -(1298 ) 3.01 Tj -0 -68.0727 Td -(1299 ) 3.01 Tj -0 -72 Td -(Sheet 12) 4.816 Tj +/F9_0 8.70222 Tf +(Aug 30 10:08 2007 xv6/main.c Page 2) 161.635 Tj +0 -28.4801 Td +(1250 // enable interrupts on this processor.) 200.952 Tj +0 -37.9735 Td +(1251 cpus[cpu\(\)].nlock--;) 117.95 Tj +0 -47.4668 Td +(1252 sti\(\);) 56.7907 Tj +0 -56.9602 Td +(1253 ) 21.8426 Tj +0 -66.4535 Td +(1254 scheduler\(\);) 83.0018 Tj +0 -75.9469 Td +(1255 }) 26.2111 Tj +0 -85.4403 Td +(1256 ) 21.8426 Tj +0 -94.9336 Td +(1257 // Additional processors start here.) 179.109 Tj +0 -104.427 Td +(1258 static void) 69.8962 Tj +0 -113.92 Td +(1259 mpmain\(void\)) 74.2647 Tj +0 -123.414 Td +(1260 {) 26.2111 Tj +0 -132.907 Td +(1261 cprintf\("cpu%d: starting\\n", cpu\(\)\);) 187.846 Tj +0 -142.4 Td +(1262 idtinit\(\);) 74.2647 Tj +0 -151.894 Td +(1263 lapic_init\(cpu\(\)\);) 109.213 Tj +0 -161.387 Td +(1264 setupsegs\(0\);) 87.3703 Tj +0 -170.88 Td +(1265 cpuid\(0, 0, 0, 0, 0\); // memory barrier) 205.32 Tj +0 -180.374 Td +(1266 cpus[cpu\(\)].booted = 1;) 131.055 Tj +0 -189.867 Td +(1267 ) 21.8426 Tj +0 -199.361 Td +(1268 // Enable interrupts on this processor.) 200.952 Tj +0 -208.854 Td +(1269 cpus[cpu\(\)].nlock--;) 117.95 Tj +0 -218.347 Td +(1270 sti\(\);) 56.7907 Tj +0 -227.841 Td +(1271 ) 21.8426 Tj +0 -237.334 Td +(1272 scheduler\(\);) 83.0018 Tj +0 -246.827 Td +(1273 }) 26.2111 Tj +0 -256.321 Td +(1274 ) 21.8426 Tj +0 -265.814 Td +(1275 static void) 69.8962 Tj +0 -275.307 Td +(1276 bootothers\(void\)) 91.7388 Tj +0 -284.801 Td +(1277 {) 26.2111 Tj +0 -294.294 Td +(1278 extern uchar _binary_bootother_start[], _binary_bootothe\ +r_size[];) 314.533 Tj +0 -303.788 Td +(1279 uchar *code;) 83.0018 Tj +0 -313.281 Td +(1280 struct cpu *c;) 91.7388 Tj +0 -322.774 Td +(1281 ) 21.8426 Tj +0 -332.268 Td +(1282 // Write bootstrap code to unused memory at 0x7000.) 253.374 Tj +0 -341.761 Td +(1283 code = \(uchar*\)0x7000;) 126.687 Tj +0 -351.254 Td +(1284 memmove\(code, _binary_bootother_start, \(uint\)_binary_\ +bootother_size\);) 332.007 Tj +0 -360.748 Td +(1285 ) 21.8426 Tj +0 -370.241 Td +(1286 for\(c = cpus; c < cpus+ncpu; c++\){) 179.109 Tj +0 -379.734 Td +(1287 if\(c == cpus+cpu\(\)\) // We've started already.) 240.268 Tj +0 -389.228 Td +(1288 continue;) 87.3703 Tj +0 -398.721 Td +(1289 ) 21.8426 Tj +0 -408.214 Td +(1290 // Fill in %esp, %eip and start code on cpu.) 231.531 Tj +0 -417.708 Td +(1291 *\(void**\)\(code-4\) = c->mpstack + 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 @@ -6744,7 +7144,10 @@ pdfEndPage %%Page: 20 20 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -6752,241 +7155,255 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/main.c Page 3) 22.274 Tj -0 -3.92728 Td -(1300 // Additional processors start here.) 24.682 Tj -0 -5.23637 Td -(1301 void) 5.418 Tj -0 -6.54546 Td -(1302 mpmain\(void\)) 10.234 Tj -0 -7.85455 Td -(1303 {) 3.612 Tj -0 -9.16364 Td -(1304 cprintf\("cpu%d: starting\\n", cpu\(\)\);) 25.886 Tj -0 -10.4727 Td -(1305 idtinit\(\); // CPU's idt) 18.06 Tj -0 -11.7818 Td -(1306 if\(cpu\(\) == 0\)) 12.642 Tj -0 -13.0909 Td -(1307 panic\("mpmain on cpu 0"\);) 20.468 Tj -0 -14.4 Td -(1308 lapic_init\(cpu\(\)\);) 15.05 Tj -0 -15.7091 Td -(1309 lapic_timerinit\(\);) 15.05 Tj -0 -17.0182 Td -(1310 lapic_enableintr\(\);) 15.652 Tj -0 -18.3273 Td -(1311 ) 3.01 Tj -0 -19.6364 Td -(1312 // make sure there's a TSS) 19.866 Tj -0 -20.9455 Td -(1313 setupsegs\(0\);) 12.04 Tj -0 -22.2545 Td -(1314 ) 3.01 Tj -0 -23.5636 Td -(1315 cpuid\(0, 0, 0, 0, 0\); // memory barrier) 28.294 Tj -0 -24.8727 Td -(1316 cpus[cpu\(\)].booted = 1;) 18.06 Tj -0 -26.1818 Td -(1317 ) 3.01 Tj -0 -27.4909 Td -(1318 // Enable interrupts on this processor.) 27.692 Tj -0 -28.8 Td -(1319 cpus[cpu\(\)].nlock--;) 16.254 Tj -0 -30.1091 Td -(1320 sti\(\);) 7.826 Tj -0 -31.4182 Td -(1321 ) 3.01 Tj -0 -32.7273 Td -(1322 scheduler\(\);) 11.438 Tj -0 -34.0364 Td -(1323 }) 3.612 Tj -0 -35.3454 Td -(1324 ) 3.01 Tj -0 -36.6545 Td -(1325 // proc[0] starts here, called by scheduler\(\) in the ordinary way.) 42.742 Tj -0 -37.9636 Td -(1326 void) 5.418 Tj -0 -39.2727 Td -(1327 process0\(\)) 9.03 Tj -0 -40.5818 Td -(1328 {) 3.612 Tj -0 -41.8909 Td -(1329 struct proc *p0 = &proc[0];) 20.468 Tj -0 -43.2 Td -(1330 struct proc *p1;) 13.846 Tj -0 -44.5091 Td -(1331 extern struct spinlock proc_table_lock;) 27.692 Tj -0 -45.8182 Td -(1332 struct trapframe tf;) 16.254 Tj -0 -47.1272 Td -(1333 ) 3.01 Tj -0 -48.4363 Td -(1334 release\(&proc_table_lock\);) 19.866 Tj -0 -49.7454 Td -(1335 ) 3.01 Tj -0 -51.0545 Td -(1336 p0->cwd = iget\(rootdev, 1\);) 20.468 Tj -0 -52.3636 Td -(1337 iunlock\(p0->cwd\);) 14.448 Tj -0 -53.6727 Td -(1338 ) 3.01 Tj -0 -54.9818 Td -(1339 // dummy user memory to make copyproc\(\) happy.) 31.906 Tj -0 -56.2909 Td -(1340 // must be big enough to hold the init binary.) 31.906 Tj -0 -57.6 Td -(1341 p0->sz = PAGE;) 12.642 Tj -0 -58.9091 Td -(1342 p0->mem = kalloc\(p0->sz\);) 19.264 Tj -0 -60.2181 Td -(1343 ) 3.01 Tj -0 -61.5272 Td -(1344 // fake a trap frame as if a user process had made a system) 39.732 Tj -0 -62.8363 Td -(1345 // call, so that copyproc will have a place for the new) 37.324 Tj -0 -64.1454 Td -(1346 // process to return to.) 18.662 Tj -0 -65.4545 Td -(1347 p0->tf = &tf;) 12.04 Tj -0 -66.7636 Td -(1348 memset\(p0->tf, 0, sizeof\(struct trapframe\)\);) 30.702 Tj -0 -68.0727 Td -(1349 p0->tf->es = p0->tf->ds = p0->tf->ss = \(SEG_UDATA << 3\) | 3;) 40.334 Tj -0 -72 Td -(Sheet 13) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/main.c Page 4) 22.274 Tj -0 -3.92728 Td -(1350 p0->tf->cs = \(SEG_UCODE << 3\) | 3;) 24.682 Tj -0 -5.23637 Td -(1351 p0->tf->eflags = FL_IF;) 18.06 Tj -0 -6.54546 Td -(1352 p0->tf->esp = p0->sz;) 16.856 Tj -0 -7.85455 Td -(1353 ) 3.01 Tj -0 -9.16364 Td -(1354 p1 = copyproc\(p0\);) 15.05 Tj -0 -10.4727 Td -(1355 ) 3.01 Tj -0 -11.7818 Td -(1356 load_icode\(p1, _binary__init_start, \(uint\) _binary__init_size\);) 42.14 Tj -0 -13.0909 Td -(1357 p1->state = RUNNABLE;) 16.856 Tj -0 -14.4 Td -(1358 ) 3.01 Tj -0 -15.7091 Td -(1359 proc_wait\(\);) 11.438 Tj -0 -17.0182 Td -(1360 panic\("init exited"\);) 16.856 Tj -0 -18.3273 Td -(1361 }) 3.612 Tj -0 -19.6364 Td -(1362 ) 3.01 Tj -0 -20.9455 Td -(1363 void) 5.418 Tj -0 -22.2545 Td -(1364 load_icode\(struct proc *p, uchar *binary, uint size\)) 34.314 Tj -0 -23.5636 Td -(1365 {) 3.612 Tj -0 -24.8727 Td -(1366 int i;) 7.826 Tj -0 -26.1818 Td -(1367 struct elfhdr *elf;) 15.652 Tj -0 -27.4909 Td -(1368 struct proghdr *ph;) 15.652 Tj -0 -28.8 Td -(1369 ) 3.01 Tj -0 -30.1091 Td -(1370 elf = \(struct elfhdr*\) binary;) 22.274 Tj -0 -31.4182 Td -(1371 if\(elf->magic != ELF_MAGIC\)) 20.468 Tj -0 -32.7273 Td -(1372 panic\("load_icode: not an ELF binary"\);) 28.896 Tj -0 -34.0364 Td -(1373 ) 3.01 Tj -0 -35.3454 Td -(1374 p->tf->eip = elf->entry;) 18.662 Tj -0 -36.6545 Td -(1375 ) 3.01 Tj -0 -37.9636 Td -(1376 // Map and load segments as directed.) 26.488 Tj -0 -39.2727 Td -(1377 ph = \(struct proghdr*\) \(binary + elf->phoff\);) 31.304 Tj -0 -40.5818 Td -(1378 for\(i = 0; i < elf->phnum; i++, ph++\) {) 27.692 Tj -0 -41.8909 Td -(1379 if\(ph->type != ELF_PROG_LOAD\)) 22.876 Tj -0 -43.2 Td -(1380 continue;) 12.04 Tj -0 -44.5091 Td -(1381 if\(ph->va + ph->memsz < ph->va\)) 24.08 Tj -0 -45.8182 Td -(1382 panic\("load_icode: overflow in proghdr"\);) 31.304 Tj -0 -47.1272 Td -(1383 if\(ph->va + ph->memsz >= p->sz\)) 24.08 Tj -0 -48.4363 Td -(1384 panic\("load_icode: icode too large"\);) 28.896 Tj -0 -49.7454 Td -(1385 ) 3.01 Tj -0 -51.0545 Td -(1386 // Load/clear the segment) 20.468 Tj -0 -52.3636 Td -(1387 memmove\(p->mem + ph->va, binary + ph->offset, ph->filesz\);) 40.334 Tj -0 -53.6727 Td -(1388 memset\(p->mem + ph->va + ph->filesz, 0, ph->memsz - ph->filesz\);) 43.946 Tj -0 -54.9818 Td -(1389 }) 4.816 Tj -0 -56.2909 Td -(1390 }) 3.612 Tj -0 -57.6 Td -(1391 ) 3.01 Tj -0 -58.9091 Td -(1392 ) 3.01 Tj -0 -60.2181 Td -(1393 ) 3.01 Tj -0 -61.5272 Td -(1394 ) 3.01 Tj -0 -62.8363 Td -(1395 ) 3.01 Tj -0 -64.1454 Td -(1396 ) 3.01 Tj -0 -65.4545 Td -(1397 ) 3.01 Tj -0 -66.7636 Td -(1398 ) 3.01 Tj -0 -68.0727 Td -(1399 ) 3.01 Tj -0 -72 Td -(Sheet 13) 4.816 Tj +/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 @@ -6998,6 +7415,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -7005,241 +7425,259 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mp.c Page 1) 21.07 Tj -0 -3.92728 Td -(1400 #include "types.h") 13.846 Tj -0 -5.23637 Td -(1401 #include "mp.h") 12.04 Tj -0 -6.54546 Td -(1402 #include "defs.h") 13.244 Tj -0 -7.85455 Td -(1403 #include "param.h") 13.846 Tj -0 -9.16364 Td -(1404 #include "x86.h") 12.642 Tj -0 -10.4727 Td -(1405 #include "traps.h") 13.846 Tj -0 -11.7818 Td -(1406 #include "mmu.h") 12.642 Tj -0 -13.0909 Td -(1407 #include "proc.h") 13.244 Tj -0 -14.4 Td -(1408 ) 3.01 Tj -0 -15.7091 Td -(1409 static char *buses[] = {) 17.458 Tj -0 -17.0182 Td -(1410 "CBUSI ",) 9.632 Tj -0 -18.3273 Td -(1411 "CBUSII",) 9.632 Tj -0 -19.6364 Td -(1412 "EISA ",) 9.632 Tj -0 -20.9455 Td -(1413 "FUTURE",) 9.632 Tj -0 -22.2545 Td -(1414 "INTERN",) 9.632 Tj -0 -23.5636 Td -(1415 "ISA ",) 9.632 Tj -0 -24.8727 Td -(1416 "MBI ",) 9.632 Tj -0 -26.1818 Td -(1417 "MBII ",) 9.632 Tj -0 -27.4909 Td -(1418 "MCA ",) 9.632 Tj -0 -28.8 Td -(1419 "MPI ",) 9.632 Tj -0 -30.1091 Td -(1420 "MPSA ",) 9.632 Tj -0 -31.4182 Td -(1421 "NUBUS ",) 9.632 Tj -0 -32.7273 Td -(1422 "PCI ",) 9.632 Tj -0 -34.0364 Td -(1423 "PCMCIA",) 9.632 Tj -0 -35.3454 Td -(1424 "TC ",) 9.632 Tj -0 -36.6545 Td -(1425 "VL ",) 9.632 Tj -0 -37.9636 Td -(1426 "VME ",) 9.632 Tj -0 -39.2727 Td -(1427 "XPRESS",) 9.632 Tj -0 -40.5818 Td -(1428 0,) 5.418 Tj -0 -41.8909 Td -(1429 };) 4.214 Tj -0 -43.2 Td -(1430 ) 3.01 Tj -0 -44.5091 Td -(1431 struct cpu cpus[NCPU];) 16.254 Tj -0 -45.8182 Td -(1432 int ismp;) 8.428 Tj -0 -47.1272 Td -(1433 int ncpu;) 8.428 Tj -0 -48.4363 Td -(1434 uchar ioapic_id;) 12.642 Tj -0 -49.7454 Td -(1435 ) 3.01 Tj -0 -51.0545 Td -(1436 static struct cpu *bcpu;) 17.458 Tj -0 -52.3636 Td -(1437 static struct mp *mp; // The MP floating point structure) 37.324 Tj -0 -53.6727 Td -(1438 ) 3.01 Tj -0 -54.9818 Td -(1439 static struct mp*) 13.244 Tj -0 -56.2909 Td -(1440 mp_scan\(uchar *addr, int len\)) 20.468 Tj -0 -57.6 Td -(1441 {) 3.612 Tj -0 -58.9091 Td -(1442 uchar *e, *p, sum;) 15.05 Tj -0 -60.2181 Td -(1443 int i;) 7.826 Tj -0 -61.5272 Td -(1444 ) 3.01 Tj -0 -62.8363 Td -(1445 e = addr+len;) 12.04 Tj -0 -64.1454 Td -(1446 for\(p = addr; p < e; p += sizeof\(struct mp\)\){) 31.304 Tj -0 -65.4545 Td -(1447 if\(memcmp\(p, "_MP_", 4\)\)) 19.866 Tj -0 -66.7636 Td -(1448 continue;) 12.04 Tj -0 -68.0727 Td -(1449 sum = 0;) 10.234 Tj -0 -72 Td -(Sheet 14) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mp.c Page 2) 21.07 Tj -0 -3.92728 Td -(1450 for\(i = 0; i < sizeof\(struct mp\); i++\)) 28.294 Tj -0 -5.23637 Td -(1451 sum += p[i];) 13.846 Tj -0 -6.54546 Td -(1452 if\(sum == 0\)) 12.642 Tj -0 -7.85455 Td -(1453 return \(struct mp*\)p;) 19.264 Tj -0 -9.16364 Td -(1454 }) 4.816 Tj -0 -10.4727 Td -(1455 return 0;) 9.632 Tj -0 -11.7818 Td -(1456 }) 3.612 Tj -0 -13.0909 Td -(1457 ) 3.01 Tj -0 -14.4 Td -(1458 // Search for the MP Floating Pointer Structure, which according to the) 45.752 Tj -0 -15.7091 Td -(1459 // spec is in one of the following three locations:) 33.712 Tj -0 -17.0182 Td -(1460 // 1\) in the first KB of the EBDA;) 23.478 Tj -0 -18.3273 Td -(1461 // 2\) in the last KB of system base memory;) 28.896 Tj -0 -19.6364 Td -(1462 // 3\) in the BIOS ROM between 0xE0000 and 0xFFFFF.) 33.11 Tj -0 -20.9455 Td -(1463 static struct mp*) 13.244 Tj -0 -22.2545 Td -(1464 mp_search\(void\)) 12.04 Tj -0 -23.5636 Td -(1465 {) 3.612 Tj -0 -24.8727 Td -(1466 uchar *bda;) 10.836 Tj -0 -26.1818 Td -(1467 uint p;) 8.428 Tj -0 -27.4909 Td -(1468 struct mp *mp;) 12.642 Tj -0 -28.8 Td -(1469 ) 3.01 Tj -0 -30.1091 Td -(1470 bda = \(uchar*\) 0x400;) 16.856 Tj -0 -31.4182 Td -(1471 if\(\(p = \(bda[0x0F]<<8\)|bda[0x0E]\)\){) 25.284 Tj -0 -32.7273 Td -(1472 if\(\(mp = mp_scan\(\(uchar*\) p, 1024\)\)\)) 27.09 Tj -0 -34.0364 Td -(1473 return mp;) 12.642 Tj -0 -35.3454 Td -(1474 }) 4.816 Tj -0 -36.6545 Td -(1475 else{) 7.224 Tj -0 -37.9636 Td -(1476 p = \(\(bda[0x14]<<8\)|bda[0x13]\)*1024;) 27.09 Tj -0 -39.2727 Td -(1477 if\(\(mp = mp_scan\(\(uchar*\)p-1024, 1024\)\)\)) 29.498 Tj -0 -40.5818 Td -(1478 return mp;) 12.642 Tj -0 -41.8909 Td -(1479 }) 4.816 Tj -0 -43.2 Td -(1480 return mp_scan\(\(uchar*\)0xF0000, 0x10000\);) 28.896 Tj -0 -44.5091 Td -(1481 }) 3.612 Tj -0 -45.8182 Td -(1482 ) 3.01 Tj -0 -47.1272 Td -(1483 // Search for an MP configuration table. For now,) 32.508 Tj -0 -48.4363 Td -(1484 // don't accept the default configurations \(physaddr == 0\).) 38.528 Tj -0 -49.7454 Td -(1485 // Check for correct signature, calculate the checksum and,) 38.528 Tj -0 -51.0545 Td -(1486 // if correct, check the version.) 22.876 Tj -0 -52.3636 Td -(1487 // To do: check extended table checksum.) 27.09 Tj -0 -53.6727 Td -(1488 static int) 9.03 Tj -0 -54.9818 Td -(1489 mp_detect\(void\)) 12.04 Tj -0 -56.2909 Td -(1490 {) 3.612 Tj -0 -57.6 Td -(1491 struct mpctb *pcmp;) 15.652 Tj -0 -58.9091 Td -(1492 uchar *p, sum;) 12.642 Tj -0 -60.2181 Td -(1493 uint length;) 11.438 Tj -0 -61.5272 Td -(1494 ) 3.01 Tj -0 -62.8363 Td -(1495 if\(\(mp = mp_search\(\)\) == 0 || mp->physaddr == 0\)) 33.11 Tj -0 -64.1454 Td -(1496 return 1;) 10.836 Tj -0 -65.4545 Td -(1497 ) 3.01 Tj -0 -66.7636 Td -(1498 ) 3.01 Tj -0 -68.0727 Td -(1499 ) 3.01 Tj -0 -72 Td -(Sheet 14) 4.816 Tj +/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 @@ -7250,7 +7688,10 @@ pdfEndPage %%Page: 22 22 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -7258,241 +7699,268 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mp.c Page 3) 21.07 Tj -0 -3.92728 Td -(1500 pcmp = \(struct mpctb*\) mp->physaddr;) 25.886 Tj -0 -5.23637 Td -(1501 if\(memcmp\(pcmp, "PCMP", 4\)\)) 20.468 Tj -0 -6.54546 Td -(1502 return 2;) 10.836 Tj -0 -7.85455 Td -(1503 ) 3.01 Tj -0 -9.16364 Td -(1504 length = pcmp->length;) 17.458 Tj -0 -10.4727 Td -(1505 sum = 0;) 9.03 Tj -0 -11.7818 Td -(1506 for\(p = \(uchar*\)pcmp; length; length--\)) 27.692 Tj -0 -13.0909 Td -(1507 sum += *p++;) 12.642 Tj -0 -14.4 Td -(1508 ) 3.01 Tj -0 -15.7091 Td -(1509 if\(sum || \(pcmp->version != 1 && pcmp->version != 4\)\)) 36.12 Tj -0 -17.0182 Td -(1510 return 3;) 10.836 Tj -0 -18.3273 Td -(1511 ) 3.01 Tj -0 -19.6364 Td -(1512 return 0;) 9.632 Tj -0 -20.9455 Td -(1513 }) 3.612 Tj -0 -22.2545 Td -(1514 ) 3.01 Tj -0 -23.5636 Td -(1515 void) 5.418 Tj -0 -24.8727 Td -(1516 mp_init\(void\)) 10.836 Tj -0 -26.1818 Td -(1517 {) 3.612 Tj -0 -27.4909 Td -(1518 int r;) 7.826 Tj -0 -28.8 Td -(1519 uchar *p, *e;) 12.04 Tj -0 -30.1091 Td -(1520 struct mpctb *mpctb;) 16.254 Tj -0 -31.4182 Td -(1521 struct mppe *proc;) 15.05 Tj -0 -32.7273 Td -(1522 struct mpbe *bus;) 14.448 Tj -0 -34.0364 Td -(1523 struct mpioapic *ioapic;) 18.662 Tj -0 -35.3454 Td -(1524 struct mpie *intr;) 15.05 Tj -0 -36.6545 Td -(1525 int i;) 7.826 Tj -0 -37.9636 Td -(1526 uchar byte;) 10.836 Tj -0 -39.2727 Td -(1527 ) 3.01 Tj -0 -40.5818 Td -(1528 ncpu = 0;) 9.632 Tj -0 -41.8909 Td -(1529 if\(\(r = mp_detect\(\)\) != 0\) {) 21.07 Tj -0 -43.2 Td -(1530 return;) 9.632 Tj -0 -44.5091 Td -(1531 }) 4.816 Tj -0 -45.8182 Td -(1532 ) 3.01 Tj -0 -47.1272 Td -(1533 ismp = 1;) 9.632 Tj -0 -48.4363 Td -(1534 ) 3.01 Tj -0 -49.7454 Td -(1535 // Run through the table saving information needed for starting) 42.14 Tj -0 -51.0545 Td -(1536 // application processors and initialising any I/O APICs. The table) 44.548 Tj -0 -52.3636 Td -(1537 // is guaranteed to be in order such that only one pass is necessary.) 45.752 Tj -0 -53.6727 Td -(1538 ) 3.01 Tj -0 -54.9818 Td -(1539 mpctb = \(struct mpctb*\) mp->physaddr;) 26.488 Tj -0 -56.2909 Td -(1540 lapicaddr = \(uint*\) mpctb->lapicaddr;) 26.488 Tj -0 -57.6 Td -(1541 p = \(\(uchar*\)mpctb\)+sizeof\(struct mpctb\);) 28.896 Tj -0 -58.9091 Td -(1542 e = \(\(uchar*\)mpctb\)+mpctb->length;) 24.682 Tj -0 -60.2181 Td -(1543 ) 3.01 Tj -0 -61.5272 Td -(1544 while\(p < e\) {) 12.642 Tj -0 -62.8363 Td -(1545 switch\(*p\){) 12.04 Tj -0 -64.1454 Td -(1546 case MPPROCESSOR:) 15.652 Tj -0 -65.4545 Td -(1547 proc = \(struct mppe*\) p;) 21.07 Tj -0 -66.7636 Td -(1548 cpus[ncpu].apicid = proc->apicid;) 26.488 Tj -0 -68.0727 Td -(1549 if\(proc->flags & MPBP\) {) 21.07 Tj -0 -72 Td -(Sheet 15) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mp.c Page 4) 21.07 Tj -0 -3.92728 Td -(1550 bcpu = &cpus[ncpu];) 19.264 Tj -0 -5.23637 Td -(1551 }) 7.224 Tj -0 -6.54546 Td -(1552 ncpu++;) 10.836 Tj -0 -7.85455 Td -(1553 p += sizeof\(struct mppe\);) 21.672 Tj -0 -9.16364 Td -(1554 continue;) 12.04 Tj -0 -10.4727 Td -(1555 case MPBUS:) 12.04 Tj -0 -11.7818 Td -(1556 bus = \(struct mpbe*\) p;) 20.468 Tj -0 -13.0909 Td -(1557 for\(i = 0; buses[i]; i++\){) 22.274 Tj -0 -14.4 Td -(1558 if\(strncmp\(buses[i], bus->string, sizeof\(bus->string\)\) == 0\)) 43.946 Tj -0 -15.7091 Td -(1559 break;) 12.642 Tj -0 -17.0182 Td -(1560 }) 7.224 Tj -0 -18.3273 Td -(1561 p += sizeof\(struct mpbe\);) 21.672 Tj -0 -19.6364 Td -(1562 continue;) 12.04 Tj -0 -20.9455 Td -(1563 case MPIOAPIC:) 13.846 Tj -0 -22.2545 Td -(1564 ioapic = \(struct mpioapic*\) p;) 24.682 Tj -0 -23.5636 Td -(1565 ioapic_id = ioapic->apicno;) 22.876 Tj -0 -24.8727 Td -(1566 p += sizeof\(struct mpioapic\);) 24.08 Tj -0 -26.1818 Td -(1567 continue;) 12.04 Tj -0 -27.4909 Td -(1568 case MPIOINTR:) 13.846 Tj -0 -28.8 Td -(1569 intr = \(struct mpie*\) p;) 21.07 Tj -0 -30.1091 Td -(1570 p += sizeof\(struct mpie\);) 21.672 Tj -0 -31.4182 Td -(1571 continue;) 12.04 Tj -0 -32.7273 Td -(1572 default:) 10.234 Tj -0 -34.0364 Td -(1573 cprintf\("mp_init: unknown PCMP type 0x%x \(e-p 0x%x\)\\n", *p, e-p\);) 45.752 Tj -0 -35.3454 Td -(1574 while\(p < e\){) 14.448 Tj -0 -36.6545 Td -(1575 cprintf\("%uX ", *p\);) 19.866 Tj -0 -37.9636 Td -(1576 p++;) 10.234 Tj -0 -39.2727 Td -(1577 }) 7.224 Tj -0 -40.5818 Td -(1578 break;) 10.234 Tj -0 -41.8909 Td -(1579 }) 6.02 Tj -0 -43.2 Td -(1580 }) 4.816 Tj -0 -44.5091 Td -(1581 ) 3.01 Tj -0 -45.8182 Td -(1582 if\(mp->imcrp\) {) 13.244 Tj -0 -47.1272 Td -(1583 // It appears that Bochs doesn't support IMCR, so code won't run.) 44.548 Tj -0 -48.4363 Td -(1584 outb\(0x22, 0x70\); // Select IMCR) 25.886 Tj -0 -49.7454 Td -(1585 byte = inb\(0x23\); // Current contents) 28.896 Tj -0 -51.0545 Td -(1586 byte |= 0x01; // Mask external INTR) 30.1 Tj -0 -52.3636 Td -(1587 outb\(0x23, byte\); // Disconnect 8259s/NMI) 31.304 Tj -0 -53.6727 Td -(1588 }) 4.816 Tj -0 -54.9818 Td -(1589 }) 3.612 Tj -0 -56.2909 Td -(1590 ) 3.01 Tj -0 -57.6 Td -(1591 ) 3.01 Tj -0 -58.9091 Td -(1592 int) 4.816 Tj -0 -60.2181 Td -(1593 mp_bcpu\(void\)) 10.836 Tj -0 -61.5272 Td -(1594 {) 3.612 Tj -0 -62.8363 Td -(1595 if\(ismp\)) 9.03 Tj -0 -64.1454 Td -(1596 return bcpu-cpus;) 15.652 Tj -0 -65.4545 Td -(1597 return 0;) 9.632 Tj -0 -66.7636 Td -(1598 }) 3.612 Tj -0 -68.0727 Td -(1599 ) 3.01 Tj -0 -72 Td -(Sheet 15) 4.816 Tj +/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 @@ -7504,6 +7972,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -7511,241 +7982,259 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/mp.c Page 5) 21.07 Tj -0 -3.92728 Td -(1600 extern void mpmain\(void\);) 18.06 Tj -0 -5.23637 Td -(1601 ) 3.01 Tj -0 -6.54546 Td -(1602 // Write bootstrap code to unused memory at 0x7000.) 33.712 Tj -0 -7.85455 Td -(1603 #define APBOOTCODE 0x7000) 18.06 Tj -0 -9.16364 Td -(1604 ) 3.01 Tj -0 -10.4727 Td -(1605 void) 5.418 Tj -0 -11.7818 Td -(1606 mp_startthem\(void\)) 13.846 Tj -0 -13.0909 Td -(1607 {) 3.612 Tj -0 -14.4 Td -(1608 extern uchar _binary_bootother_start[], _binary_bootother_size[];) 43.344 Tj -0 -15.7091 Td -(1609 extern int main\(\);) 15.05 Tj -0 -17.0182 Td -(1610 int c;) 7.826 Tj -0 -18.3273 Td -(1611 ) 3.01 Tj -0 -19.6364 Td -(1612 memmove\(\(void*\) APBOOTCODE,_binary_bootother_start,) 34.916 Tj -0 -20.9455 Td -(1613 \(uint\) _binary_bootother_size\);) 27.692 Tj -0 -22.2545 Td -(1614 ) 3.01 Tj -0 -23.5636 Td -(1615 for\(c = 0; c < ncpu; c++\){) 19.866 Tj -0 -24.8727 Td -(1616 // Our current cpu has already started.) 28.896 Tj -0 -26.1818 Td -(1617 if\(c == cpu\(\)\)) 13.846 Tj -0 -27.4909 Td -(1618 continue;) 12.04 Tj -0 -28.8 Td -(1619 ) 3.01 Tj -0 -30.1091 Td -(1620 // Set target %esp) 16.254 Tj -0 -31.4182 Td -(1621 *\(uint*\)\(APBOOTCODE-4\) = \(uint\) \(cpus[c].mpstack\) + MPSTACK;) 41.538 Tj -0 -32.7273 Td -(1622 ) 3.01 Tj -0 -34.0364 Td -(1623 // Set target %eip) 16.254 Tj -0 -35.3454 Td -(1624 *\(uint*\)\(APBOOTCODE-8\) = \(uint\)mpmain;) 28.294 Tj -0 -36.6545 Td -(1625 ) 3.01 Tj -0 -37.9636 Td -(1626 // Go!) 9.03 Tj -0 -39.2727 Td -(1627 lapic_startap\(cpus[c].apicid, \(uint\) APBOOTCODE\);) 34.916 Tj -0 -40.5818 Td -(1628 ) 3.01 Tj -0 -41.8909 Td -(1629 // Wait for cpu to get through bootstrap.) 30.1 Tj -0 -43.2 Td -(1630 while\(cpus[c].booted == 0\)) 21.07 Tj -0 -44.5091 Td -(1631 ;) 7.224 Tj -0 -45.8182 Td -(1632 }) 4.816 Tj -0 -47.1272 Td -(1633 }) 3.612 Tj -0 -48.4363 Td -(1634 ) 3.01 Tj -0 -49.7454 Td -(1635 ) 3.01 Tj -0 -51.0545 Td -(1636 ) 3.01 Tj -0 -52.3636 Td -(1637 ) 3.01 Tj -0 -53.6727 Td -(1638 ) 3.01 Tj -0 -54.9818 Td -(1639 ) 3.01 Tj -0 -56.2909 Td -(1640 ) 3.01 Tj -0 -57.6 Td -(1641 ) 3.01 Tj -0 -58.9091 Td -(1642 ) 3.01 Tj -0 -60.2181 Td -(1643 ) 3.01 Tj -0 -61.5272 Td -(1644 ) 3.01 Tj -0 -62.8363 Td -(1645 ) 3.01 Tj -0 -64.1454 Td -(1646 ) 3.01 Tj -0 -65.4545 Td -(1647 ) 3.01 Tj -0 -66.7636 Td -(1648 ) 3.01 Tj -0 -68.0727 Td -(1649 ) 3.01 Tj -0 -72 Td -(Sheet 16) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/init.c Page 1) 22.274 Tj -0 -3.92728 Td -(1650 #include "types.h") 13.846 Tj -0 -5.23637 Td -(1651 #include "stat.h") 13.244 Tj -0 -6.54546 Td -(1652 #include "user.h") 13.244 Tj -0 -7.85455 Td -(1653 #include "fs.h") 12.04 Tj -0 -9.16364 Td -(1654 #include "fcntl.h") 13.846 Tj -0 -10.4727 Td -(1655 ) 3.01 Tj -0 -11.7818 Td -(1656 // init: The initial user-level program) 26.488 Tj -0 -13.0909 Td -(1657 ) 3.01 Tj -0 -14.4 Td -(1658 char *sh_args[] = { "sh", 0 };) 21.07 Tj -0 -15.7091 Td -(1659 ) 3.01 Tj -0 -17.0182 Td -(1660 int) 4.816 Tj -0 -18.3273 Td -(1661 main\(void\)) 9.03 Tj -0 -19.6364 Td -(1662 {) 3.612 Tj -0 -20.9455 Td -(1663 int pid;) 9.03 Tj -0 -22.2545 Td -(1664 ) 3.01 Tj -0 -23.5636 Td -(1665 if\(open\("console", O_RDWR\) < 0\){) 23.478 Tj -0 -24.8727 Td -(1666 mknod\("console", T_DEV, 1, 1\);) 23.478 Tj -0 -26.1818 Td -(1667 open\("console", O_RDWR\);) 19.866 Tj -0 -27.4909 Td -(1668 }) 4.816 Tj -0 -28.8 Td -(1669 dup\(0\); // stdout) 15.05 Tj -0 -30.1091 Td -(1670 dup\(0\); // stderr) 15.05 Tj -0 -31.4182 Td -(1671 ) 3.01 Tj -0 -32.7273 Td -(1672 for\(;;\){) 9.03 Tj -0 -34.0364 Td -(1673 pid = fork\(\);) 13.244 Tj -0 -35.3454 Td -(1674 if\(pid < 0\){) 12.642 Tj -0 -36.6545 Td -(1675 puts\("init: fork failed\\n"\);) 23.478 Tj -0 -37.9636 Td -(1676 exit\(\);) 10.836 Tj -0 -39.2727 Td -(1677 }) 6.02 Tj -0 -40.5818 Td -(1678 if\(pid == 0\){) 13.244 Tj -0 -41.8909 Td -(1679 exec\("sh", sh_args\);) 18.662 Tj -0 -43.2 Td -(1680 puts\("init: exec sh failed\\n"\);) 25.284 Tj -0 -44.5091 Td -(1681 exit\(\);) 10.836 Tj -0 -45.8182 Td -(1682 } else {) 10.234 Tj -0 -47.1272 Td -(1683 wait\(\);) 10.836 Tj -0 -48.4363 Td -(1684 }) 6.02 Tj -0 -49.7454 Td -(1685 }) 4.816 Tj -0 -51.0545 Td -(1686 }) 3.612 Tj -0 -52.3636 Td -(1687 ) 3.01 Tj -0 -53.6727 Td -(1688 ) 3.01 Tj -0 -54.9818 Td -(1689 ) 3.01 Tj -0 -56.2909 Td -(1690 ) 3.01 Tj -0 -57.6 Td -(1691 ) 3.01 Tj -0 -58.9091 Td -(1692 ) 3.01 Tj -0 -60.2181 Td -(1693 ) 3.01 Tj -0 -61.5272 Td -(1694 ) 3.01 Tj -0 -62.8363 Td -(1695 ) 3.01 Tj -0 -64.1454 Td -(1696 ) 3.01 Tj -0 -65.4545 Td -(1697 ) 3.01 Tj -0 -66.7636 Td -(1698 ) 3.01 Tj -0 -68.0727 Td -(1699 ) 3.01 Tj -0 -72 Td -(Sheet 16) 4.816 Tj +/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 @@ -7756,7 +8245,10 @@ pdfEndPage %%Page: 24 24 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -7764,241 +8256,259 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/spinlock.h Page 1) 24.682 Tj -0 -3.92728 Td -(1700 // Mutual exclusion lock.) 18.06 Tj -0 -5.23637 Td -(1701 struct spinlock {) 13.244 Tj -0 -6.54546 Td -(1702 uint locked; // Is the lock held?) 25.284 Tj -0 -7.85455 Td -(1703 ) 3.01 Tj -0 -9.16364 Td -(1704 // For debugging:) 14.448 Tj -0 -10.4727 Td -(1705 char *name; // Name of lock.) 22.876 Tj -0 -11.7818 Td -(1706 int cpu; // The number of the cpu holding the lock.) 38.528 Tj -0 -13.0909 Td -(1707 uint pcs[10]; // The call stack \(an array of program counters\)) 42.14 Tj -0 -14.4 Td -(1708 // that locked the lock.) 27.692 Tj -0 -15.7091 Td -(1709 };) 4.214 Tj -0 -17.0182 Td -(1710 ) 3.01 Tj -0 -18.3273 Td -(1711 ) 3.01 Tj -0 -19.6364 Td -(1712 ) 3.01 Tj -0 -20.9455 Td -(1713 ) 3.01 Tj -0 -22.2545 Td -(1714 ) 3.01 Tj -0 -23.5636 Td -(1715 ) 3.01 Tj -0 -24.8727 Td -(1716 ) 3.01 Tj -0 -26.1818 Td -(1717 ) 3.01 Tj -0 -27.4909 Td -(1718 ) 3.01 Tj -0 -28.8 Td -(1719 ) 3.01 Tj -0 -30.1091 Td -(1720 ) 3.01 Tj -0 -31.4182 Td -(1721 ) 3.01 Tj -0 -32.7273 Td -(1722 ) 3.01 Tj -0 -34.0364 Td -(1723 ) 3.01 Tj -0 -35.3454 Td -(1724 ) 3.01 Tj -0 -36.6545 Td -(1725 ) 3.01 Tj -0 -37.9636 Td -(1726 ) 3.01 Tj -0 -39.2727 Td -(1727 ) 3.01 Tj -0 -40.5818 Td -(1728 ) 3.01 Tj -0 -41.8909 Td -(1729 ) 3.01 Tj -0 -43.2 Td -(1730 ) 3.01 Tj -0 -44.5091 Td -(1731 ) 3.01 Tj -0 -45.8182 Td -(1732 ) 3.01 Tj -0 -47.1272 Td -(1733 ) 3.01 Tj -0 -48.4363 Td -(1734 ) 3.01 Tj -0 -49.7454 Td -(1735 ) 3.01 Tj -0 -51.0545 Td -(1736 ) 3.01 Tj -0 -52.3636 Td -(1737 ) 3.01 Tj -0 -53.6727 Td -(1738 ) 3.01 Tj -0 -54.9818 Td -(1739 ) 3.01 Tj -0 -56.2909 Td -(1740 ) 3.01 Tj -0 -57.6 Td -(1741 ) 3.01 Tj -0 -58.9091 Td -(1742 ) 3.01 Tj -0 -60.2181 Td -(1743 ) 3.01 Tj -0 -61.5272 Td -(1744 ) 3.01 Tj -0 -62.8363 Td -(1745 ) 3.01 Tj -0 -64.1454 Td -(1746 ) 3.01 Tj -0 -65.4545 Td -(1747 ) 3.01 Tj -0 -66.7636 Td -(1748 ) 3.01 Tj -0 -68.0727 Td -(1749 ) 3.01 Tj -0 -72 Td -(Sheet 17) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/spinlock.c Page 1) 24.682 Tj -0 -3.92728 Td -(1750 // Mutual exclusion spin locks.) 21.672 Tj -0 -5.23637 Td -(1751 ) 3.01 Tj -0 -6.54546 Td -(1752 #include "types.h") 13.846 Tj -0 -7.85455 Td -(1753 #include "defs.h") 13.244 Tj -0 -9.16364 Td -(1754 #include "x86.h") 12.642 Tj -0 -10.4727 Td -(1755 #include "mmu.h") 12.642 Tj -0 -11.7818 Td -(1756 #include "param.h") 13.846 Tj -0 -13.0909 Td -(1757 #include "proc.h") 13.244 Tj -0 -14.4 Td -(1758 #include "spinlock.h") 15.652 Tj -0 -15.7091 Td -(1759 ) 3.01 Tj -0 -17.0182 Td -(1760 extern int use_console_lock;) 19.866 Tj -0 -18.3273 Td -(1761 ) 3.01 Tj -0 -19.6364 Td -(1762 void) 5.418 Tj -0 -20.9455 Td -(1763 initlock\(struct spinlock *lock, char *name\)) 28.896 Tj -0 -22.2545 Td -(1764 {) 3.612 Tj -0 -23.5636 Td -(1765 lock->name = name;) 15.05 Tj -0 -24.8727 Td -(1766 lock->locked = 0;) 14.448 Tj -0 -26.1818 Td -(1767 lock->cpu = 0xffffffff;) 18.06 Tj -0 -27.4909 Td -(1768 }) 3.612 Tj -0 -28.8 Td -(1769 ) 3.01 Tj -0 -30.1091 Td -(1770 // Record the current call stack in pcs[] by following the %ebp chain.) 45.15 Tj -0 -31.4182 Td -(1771 void) 5.418 Tj -0 -32.7273 Td -(1772 getcallerpcs\(void *v, uint pcs[]\)) 22.876 Tj -0 -34.0364 Td -(1773 {) 3.612 Tj -0 -35.3454 Td -(1774 uint *ebp = \(uint*\)v - 2;) 19.264 Tj -0 -36.6545 Td -(1775 int i;) 7.826 Tj -0 -37.9636 Td -(1776 for\(i = 0; i < 10; i++\){) 18.662 Tj -0 -39.2727 Td -(1777 if\(ebp == 0 || ebp == \(uint*\)0xffffffff\)) 29.498 Tj -0 -40.5818 Td -(1778 break;) 10.234 Tj -0 -41.8909 Td -(1779 pcs[i] = ebp[1]; // saved %eip) 25.886 Tj -0 -43.2 Td -(1780 ebp = \(uint*\)ebp[0]; // saved %ebp) 25.886 Tj -0 -44.5091 Td -(1781 }) 4.816 Tj -0 -45.8182 Td -(1782 for\(; i < 10; i++\)) 15.05 Tj -0 -47.1272 Td -(1783 pcs[i] = 0;) 12.04 Tj -0 -48.4363 Td -(1784 }) 3.612 Tj -0 -49.7454 Td -(1785 ) 3.01 Tj -0 -51.0545 Td -(1786 ) 3.01 Tj -0 -52.3636 Td -(1787 ) 3.01 Tj -0 -53.6727 Td -(1788 ) 3.01 Tj -0 -54.9818 Td -(1789 ) 3.01 Tj -0 -56.2909 Td -(1790 ) 3.01 Tj -0 -57.6 Td -(1791 ) 3.01 Tj -0 -58.9091 Td -(1792 ) 3.01 Tj -0 -60.2181 Td -(1793 ) 3.01 Tj -0 -61.5272 Td -(1794 ) 3.01 Tj -0 -62.8363 Td -(1795 ) 3.01 Tj -0 -64.1454 Td -(1796 ) 3.01 Tj -0 -65.4545 Td -(1797 ) 3.01 Tj -0 -66.7636 Td -(1798 ) 3.01 Tj -0 -68.0727 Td -(1799 ) 3.01 Tj -0 -72 Td -(Sheet 17) 4.816 Tj +/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 @@ -8010,6 +8520,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -8017,241 +8530,255 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/spinlock.c Page 2) 24.682 Tj -0 -3.92728 Td -(1800 // Acquire the lock.) 15.05 Tj -0 -5.23637 Td -(1801 // Loops \(spins\) until the lock is acquired.) 29.498 Tj -0 -6.54546 Td -(1802 // \(Because contention is handled by spinning, must not) 36.12 Tj -0 -7.85455 Td -(1803 // go to sleep holding any locks.\)) 23.478 Tj -0 -9.16364 Td -(1804 void) 5.418 Tj -0 -10.4727 Td -(1805 acquire\(struct spinlock *lock\)) 21.07 Tj -0 -11.7818 Td -(1806 {) 3.612 Tj -0 -13.0909 Td -(1807 if\(holding\(lock\)\)) 14.448 Tj -0 -14.4 Td -(1808 panic\("acquire"\);) 15.652 Tj -0 -15.7091 Td -(1809 ) 3.01 Tj -0 -17.0182 Td -(1810 if\(cpus[cpu\(\)].nlock == 0\)) 19.866 Tj -0 -18.3273 Td -(1811 cli\(\);) 9.03 Tj -0 -19.6364 Td -(1812 cpus[cpu\(\)].nlock++;) 16.254 Tj -0 -20.9455 Td -(1813 ) 3.01 Tj -0 -22.2545 Td -(1814 while\(cmpxchg\(0, 1, &lock->locked\) == 1\)) 28.294 Tj -0 -23.5636 Td -(1815 ;) 6.02 Tj -0 -24.8727 Td -(1816 ) 3.01 Tj -0 -26.1818 Td -(1817 // Serialize instructions: now that lock is acquired, make sure) 42.14 Tj -0 -27.4909 Td -(1818 // we wait for all pending writes from other processors.) 37.926 Tj -0 -28.8 Td -(1819 cpuid\(0, 0, 0, 0, 0\); // memory barrier \(see Ch 7, IA-32 manual vol 3\)) 46.956 Tj -0 -30.1091 Td -(1820 ) 3.01 Tj -0 -31.4182 Td -(1821 // Record info about lock acquisition for debugging.) 35.518 Tj -0 -32.7273 Td -(1822 // The +10 is only so that we can tell the difference) 36.12 Tj -0 -34.0364 Td -(1823 // between forgetting to initialize lock->cpu) 31.304 Tj -0 -35.3454 Td -(1824 // and holding a lock on cpu 0.) 22.876 Tj -0 -36.6545 Td -(1825 lock->cpu = cpu\(\) + 10;) 18.06 Tj -0 -37.9636 Td -(1826 getcallerpcs\(&lock, lock->pcs\);) 22.876 Tj -0 -39.2727 Td -(1827 }) 3.612 Tj -0 -40.5818 Td -(1828 ) 3.01 Tj -0 -41.8909 Td -(1829 // Release the lock.) 15.05 Tj -0 -43.2 Td -(1830 void) 5.418 Tj -0 -44.5091 Td -(1831 release\(struct spinlock *lock\)) 21.07 Tj -0 -45.8182 Td -(1832 {) 3.612 Tj -0 -47.1272 Td -(1833 if\(!holding\(lock\)\)) 15.05 Tj -0 -48.4363 Td -(1834 panic\("release"\);) 15.652 Tj -0 -49.7454 Td -(1835 ) 3.01 Tj -0 -51.0545 Td -(1836 lock->pcs[0] = 0;) 14.448 Tj -0 -52.3636 Td -(1837 lock->cpu = 0xffffffff;) 18.06 Tj -0 -53.6727 Td -(1838 ) 3.01 Tj -0 -54.9818 Td -(1839 // Serialize instructions: before unlocking the lock, make sure) 42.14 Tj -0 -56.2909 Td -(1840 // to flush any pending memory writes from this processor.) 39.13 Tj -0 -57.6 Td -(1841 cpuid\(0, 0, 0, 0, 0\); // memory barrier \(see Ch 7, IA-32 manual vol 3\)) 46.956 Tj -0 -58.9091 Td -(1842 ) 3.01 Tj -0 -60.2181 Td -(1843 lock->locked = 0;) 14.448 Tj -0 -61.5272 Td -(1844 if\(--cpus[cpu\(\)].nlock == 0\)) 21.07 Tj -0 -62.8363 Td -(1845 sti\(\);) 9.03 Tj -0 -64.1454 Td -(1846 }) 3.612 Tj -0 -65.4545 Td -(1847 ) 3.01 Tj -0 -66.7636 Td -(1848 ) 3.01 Tj -0 -68.0727 Td -(1849 ) 3.01 Tj -0 -72 Td -(Sheet 18) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/spinlock.c Page 3) 24.682 Tj -0 -3.92728 Td -(1850 // Check whether this cpu is holding the lock.) 30.702 Tj -0 -5.23637 Td -(1851 int) 4.816 Tj -0 -6.54546 Td -(1852 holding\(struct spinlock *lock\)) 21.07 Tj -0 -7.85455 Td -(1853 {) 3.612 Tj -0 -9.16364 Td -(1854 return lock->locked && lock->cpu == cpu\(\) + 10;) 32.508 Tj -0 -10.4727 Td -(1855 }) 3.612 Tj -0 -11.7818 Td -(1856 ) 3.01 Tj -0 -13.0909 Td -(1857 ) 3.01 Tj -0 -14.4 Td -(1858 ) 3.01 Tj -0 -15.7091 Td -(1859 ) 3.01 Tj -0 -17.0182 Td -(1860 ) 3.01 Tj -0 -18.3273 Td -(1861 ) 3.01 Tj -0 -19.6364 Td -(1862 ) 3.01 Tj -0 -20.9455 Td -(1863 ) 3.01 Tj -0 -22.2545 Td -(1864 ) 3.01 Tj -0 -23.5636 Td -(1865 ) 3.01 Tj -0 -24.8727 Td -(1866 ) 3.01 Tj -0 -26.1818 Td -(1867 ) 3.01 Tj -0 -27.4909 Td -(1868 ) 3.01 Tj -0 -28.8 Td -(1869 ) 3.01 Tj -0 -30.1091 Td -(1870 ) 3.01 Tj -0 -31.4182 Td -(1871 ) 3.01 Tj -0 -32.7273 Td -(1872 ) 3.01 Tj -0 -34.0364 Td -(1873 ) 3.01 Tj -0 -35.3454 Td -(1874 ) 3.01 Tj -0 -36.6545 Td -(1875 ) 3.01 Tj -0 -37.9636 Td -(1876 ) 3.01 Tj -0 -39.2727 Td -(1877 ) 3.01 Tj -0 -40.5818 Td -(1878 ) 3.01 Tj -0 -41.8909 Td -(1879 ) 3.01 Tj -0 -43.2 Td -(1880 ) 3.01 Tj -0 -44.5091 Td -(1881 ) 3.01 Tj -0 -45.8182 Td -(1882 ) 3.01 Tj -0 -47.1272 Td -(1883 ) 3.01 Tj -0 -48.4363 Td -(1884 ) 3.01 Tj -0 -49.7454 Td -(1885 ) 3.01 Tj -0 -51.0545 Td -(1886 ) 3.01 Tj -0 -52.3636 Td -(1887 ) 3.01 Tj -0 -53.6727 Td -(1888 ) 3.01 Tj -0 -54.9818 Td -(1889 ) 3.01 Tj -0 -56.2909 Td -(1890 ) 3.01 Tj -0 -57.6 Td -(1891 ) 3.01 Tj -0 -58.9091 Td -(1892 ) 3.01 Tj -0 -60.2181 Td -(1893 ) 3.01 Tj -0 -61.5272 Td -(1894 ) 3.01 Tj -0 -62.8363 Td -(1895 ) 3.01 Tj -0 -64.1454 Td -(1896 ) 3.01 Tj -0 -65.4545 Td -(1897 ) 3.01 Tj -0 -66.7636 Td -(1898 ) 3.01 Tj -0 -68.0727 Td -(1899 ) 3.01 Tj -0 -72 Td -(Sheet 18) 4.816 Tj +/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 @@ -8262,7 +8789,10 @@ pdfEndPage %%Page: 26 26 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -8270,241 +8800,253 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.h Page 1) 22.274 Tj -0 -3.92728 Td -(1900 // Segments in proc->gdt) 17.458 Tj -0 -5.23637 Td -(1901 #define SEG_KCODE 1 // kernel code) 24.08 Tj -0 -6.54546 Td -(1902 #define SEG_KDATA 2 // kernel data+stack) 27.692 Tj -0 -7.85455 Td -(1903 #define SEG_UCODE 3) 14.448 Tj -0 -9.16364 Td -(1904 #define SEG_UDATA 4) 14.448 Tj -0 -10.4727 Td -(1905 #define SEG_TSS 5 // this process's task state) 32.508 Tj -0 -11.7818 Td -(1906 #define NSEGS 6) 14.448 Tj -0 -13.0909 Td -(1907 ) 3.01 Tj -0 -14.4 Td -(1908 // Saved registers for kernel context switches.) 31.304 Tj -0 -15.7091 Td -(1909 // Don't need to save all the %fs etc. segment registers,) 37.324 Tj -0 -17.0182 Td -(1910 // because they are constant across kernel contexts.) 34.314 Tj -0 -18.3273 Td -(1911 // Save all the regular registers so we don't need to care) 37.926 Tj -0 -19.6364 Td -(1912 // which are caller save.) 18.06 Tj -0 -20.9455 Td -(1913 // Don't save %eax, because that's the return register.) 36.12 Tj -0 -22.2545 Td -(1914 // The layout of jmpbuf is known to setjmp.S.) 30.1 Tj -0 -23.5636 Td -(1915 struct jmpbuf {) 12.04 Tj -0 -24.8727 Td -(1916 int ebx;) 9.03 Tj -0 -26.1818 Td -(1917 int ecx;) 9.03 Tj -0 -27.4909 Td -(1918 int edx;) 9.03 Tj -0 -28.8 Td -(1919 int esi;) 9.03 Tj -0 -30.1091 Td -(1920 int edi;) 9.03 Tj -0 -31.4182 Td -(1921 int esp;) 9.03 Tj -0 -32.7273 Td -(1922 int ebp;) 9.03 Tj -0 -34.0364 Td -(1923 int eip;) 9.03 Tj -0 -35.3454 Td -(1924 };) 4.214 Tj -0 -36.6545 Td -(1925 ) 3.01 Tj -0 -37.9636 Td -(1926 enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };) 46.354 Tj -0 -39.2727 Td -(1927 ) 3.01 Tj -0 -40.5818 Td -(1928 // Per-process state) 15.05 Tj -0 -41.8909 Td -(1929 struct proc {) 10.836 Tj -0 -43.2 Td -(1930 char *mem; // Start of process memory \(kernel address\)) 45.752 Tj -0 -44.5091 Td -(1931 uint sz; // Size of process memory \(bytes\)) 39.732 Tj -0 -45.8182 Td -(1932 char *kstack; // Bottom of kernel stack for this process) 45.15 Tj -0 -47.1272 Td -(1933 enum proc_state state; // Process state) 29.498 Tj -0 -48.4363 Td -(1934 int pid; // Process ID) 27.692 Tj -0 -49.7454 Td -(1935 int ppid; // Parent pid) 27.692 Tj -0 -51.0545 Td -(1936 void *chan; // If non-zero, sleeping on chan) 39.13 Tj -0 -52.3636 Td -(1937 int killed; // If non-zero, have been killed) 39.13 Tj -0 -53.6727 Td -(1938 struct file *ofile[NOFILE]; // Open files) 29.498 Tj -0 -54.9818 Td -(1939 struct inode *cwd; // Current directory) 31.906 Tj -0 -56.2909 Td -(1940 struct jmpbuf jmpbuf; // Jump here to run process) 36.12 Tj -0 -57.6 Td -(1941 struct trapframe *tf; // Trap frame for current interrupt) 40.936 Tj -0 -58.9091 Td -(1942 };) 4.214 Tj -0 -60.2181 Td -(1943 ) 3.01 Tj -0 -61.5272 Td -(1944 ) 3.01 Tj -0 -62.8363 Td -(1945 ) 3.01 Tj -0 -64.1454 Td -(1946 ) 3.01 Tj -0 -65.4545 Td -(1947 ) 3.01 Tj -0 -66.7636 Td -(1948 ) 3.01 Tj -0 -68.0727 Td -(1949 ) 3.01 Tj -0 -72 Td -(Sheet 19) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.h Page 2) 22.274 Tj -0 -3.92728 Td -(1950 // Process memory is laid out contiguously:) 28.896 Tj -0 -5.23637 Td -(1951 // text) 8.428 Tj -0 -6.54546 Td -(1952 // original data and bss) 18.662 Tj -0 -7.85455 Td -(1953 // fixed-size stack) 15.652 Tj -0 -9.16364 Td -(1954 // expandable heap) 15.05 Tj -0 -10.4727 Td -(1955 ) 3.01 Tj -0 -11.7818 Td -(1956 extern struct proc proc[];) 18.662 Tj -0 -13.0909 Td -(1957 extern struct proc *curproc[NCPU]; // Current \(running\) process per CPU) 46.354 Tj -0 -14.4 Td -(1958 ) 3.01 Tj -0 -15.7091 Td -(1959 #define MPSTACK 512) 14.448 Tj -0 -17.0182 Td -(1960 ) 3.01 Tj -0 -18.3273 Td -(1961 // Per-CPU state) 12.642 Tj -0 -19.6364 Td -(1962 struct cpu {) 10.234 Tj -0 -20.9455 Td -(1963 uchar apicid; // Local APIC ID) 30.702 Tj -0 -22.2545 Td -(1964 struct jmpbuf jmpbuf; // Jump here to enter scheduler) 39.732 Tj -0 -23.5636 Td -(1965 struct taskstate ts; // Used by x86 to find stack for interrupt) 46.354 Tj -0 -24.8727 Td -(1966 struct segdesc gdt[NSEGS]; // x86 global descriptor table) 39.13 Tj -0 -26.1818 Td -(1967 char mpstack[MPSTACK]; // Per-CPU startup stack) 35.518 Tj -0 -27.4909 Td -(1968 volatile int booted; // Has the CPU started?) 34.916 Tj -0 -28.8 Td -(1969 int nlock; // Number of locks currently held) 40.936 Tj -0 -30.1091 Td -(1970 };) 4.214 Tj -0 -31.4182 Td -(1971 ) 3.01 Tj -0 -32.7273 Td -(1972 extern struct cpu cpus[NCPU];) 20.468 Tj -0 -34.0364 Td -(1973 extern int ncpu;) 12.642 Tj -0 -35.3454 Td -(1974 ) 3.01 Tj -0 -36.6545 Td -(1975 ) 3.01 Tj -0 -37.9636 Td -(1976 ) 3.01 Tj -0 -39.2727 Td -(1977 ) 3.01 Tj -0 -40.5818 Td -(1978 ) 3.01 Tj -0 -41.8909 Td -(1979 ) 3.01 Tj -0 -43.2 Td -(1980 ) 3.01 Tj -0 -44.5091 Td -(1981 ) 3.01 Tj -0 -45.8182 Td -(1982 ) 3.01 Tj -0 -47.1272 Td -(1983 ) 3.01 Tj -0 -48.4363 Td -(1984 ) 3.01 Tj -0 -49.7454 Td -(1985 ) 3.01 Tj -0 -51.0545 Td -(1986 ) 3.01 Tj -0 -52.3636 Td -(1987 ) 3.01 Tj -0 -53.6727 Td -(1988 ) 3.01 Tj -0 -54.9818 Td -(1989 ) 3.01 Tj -0 -56.2909 Td -(1990 ) 3.01 Tj -0 -57.6 Td -(1991 ) 3.01 Tj -0 -58.9091 Td -(1992 ) 3.01 Tj -0 -60.2181 Td -(1993 ) 3.01 Tj -0 -61.5272 Td -(1994 ) 3.01 Tj -0 -62.8363 Td -(1995 ) 3.01 Tj -0 -64.1454 Td -(1996 ) 3.01 Tj -0 -65.4545 Td -(1997 ) 3.01 Tj -0 -66.7636 Td -(1998 ) 3.01 Tj -0 -68.0727 Td -(1999 ) 3.01 Tj -0 -72 Td -(Sheet 19) 4.816 Tj +/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 @@ -8516,6 +9058,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -8523,241 +9068,255 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 1) 22.274 Tj -0 -3.92728 Td -(2000 #include "types.h") 13.846 Tj -0 -5.23637 Td -(2001 #include "mmu.h") 12.642 Tj -0 -6.54546 Td -(2002 #include "x86.h") 12.642 Tj -0 -7.85455 Td -(2003 #include "param.h") 13.846 Tj -0 -9.16364 Td -(2004 #include "file.h") 13.244 Tj -0 -10.4727 Td -(2005 #include "proc.h") 13.244 Tj -0 -11.7818 Td -(2006 #include "defs.h") 13.244 Tj -0 -13.0909 Td -(2007 #include "spinlock.h") 15.652 Tj -0 -14.4 Td -(2008 ) 3.01 Tj -0 -15.7091 Td -(2009 struct spinlock proc_table_lock;) 22.274 Tj -0 -17.0182 Td -(2010 ) 3.01 Tj -0 -18.3273 Td -(2011 struct proc proc[NPROC];) 17.458 Tj -0 -19.6364 Td -(2012 struct proc *curproc[NCPU];) 19.264 Tj -0 -20.9455 Td -(2013 int next_pid = 1;) 13.244 Tj -0 -22.2545 Td -(2014 extern void forkret\(void\);) 18.662 Tj -0 -23.5636 Td -(2015 extern void forkret1\(struct trapframe*\);) 27.09 Tj -0 -24.8727 Td -(2016 ) 3.01 Tj -0 -26.1818 Td -(2017 void) 5.418 Tj -0 -27.4909 Td -(2018 pinit\(void\)) 9.632 Tj -0 -28.8 Td -(2019 {) 3.612 Tj -0 -30.1091 Td -(2020 initlock\(&proc_table_lock, "proc_table"\);) 28.896 Tj -0 -31.4182 Td -(2021 }) 3.612 Tj -0 -32.7273 Td -(2022 ) 3.01 Tj -0 -34.0364 Td -(2023 // Set up CPU's segment descriptors and task state for a) 36.722 Tj -0 -35.3454 Td -(2024 // given process.) 13.244 Tj -0 -36.6545 Td -(2025 // If p==0, set up for "idle" state for when scheduler\(\)) 36.722 Tj -0 -37.9636 Td -(2026 // is idling, not running any process.) 25.886 Tj -0 -39.2727 Td -(2027 void) 5.418 Tj -0 -40.5818 Td -(2028 setupsegs\(struct proc *p\)) 18.06 Tj -0 -41.8909 Td -(2029 {) 3.612 Tj -0 -43.2 Td -(2030 struct cpu *c = &cpus[cpu\(\)];) 21.672 Tj -0 -44.5091 Td -(2031 ) 3.01 Tj -0 -45.8182 Td -(2032 c->ts.ss0 = SEG_KDATA << 3;) 20.468 Tj -0 -47.1272 Td -(2033 if\(p\){) 7.826 Tj -0 -48.4363 Td -(2034 c->ts.esp0 = \(uint\)\(p->kstack + KSTACKSIZE\);) 31.906 Tj -0 -49.7454 Td -(2035 } else {) 9.03 Tj -0 -51.0545 Td -(2036 c->ts.esp0 = 0xffffffff;) 19.866 Tj -0 -52.3636 Td -(2037 }) 4.816 Tj -0 -53.6727 Td -(2038 ) 3.01 Tj -0 -54.9818 Td -(2039 c->gdt[0] = SEG_NULL;) 16.856 Tj -0 -56.2909 Td -(2040 c->gdt[SEG_KCODE] = SEG\(STA_X|STA_R, 0, 0x100000 + 64*1024, 0\);) 42.14 Tj -0 -57.6 Td -(2041 c->gdt[SEG_KDATA] = SEG\(STA_W, 0, 0xffffffff, 0\);) 33.712 Tj -0 -58.9091 Td -(2042 c->gdt[SEG_TSS] = SEG16\(STS_T32A, \(uint\) &c->ts, sizeof\(c->ts\), 0\);) 44.548 Tj -0 -60.2181 Td -(2043 c->gdt[SEG_TSS].s = 0;) 17.458 Tj -0 -61.5272 Td -(2044 if\(p\){) 7.826 Tj -0 -62.8363 Td -(2045 c->gdt[SEG_UCODE] = SEG\(STA_X|STA_R, \(uint\)p->mem, p->sz, 3\);) 42.14 Tj -0 -64.1454 Td -(2046 c->gdt[SEG_UDATA] = SEG\(STA_W, \(uint\)p->mem, p->sz, 3\);) 38.528 Tj -0 -65.4545 Td -(2047 } else {) 9.03 Tj -0 -66.7636 Td -(2048 c->gdt[SEG_UCODE] = SEG_NULL;) 22.876 Tj -0 -68.0727 Td -(2049 c->gdt[SEG_UDATA] = SEG_NULL;) 22.876 Tj -0 -72 Td -(Sheet 20) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 2) 22.274 Tj -0 -3.92728 Td -(2050 }) 4.816 Tj -0 -5.23637 Td -(2051 ) 3.01 Tj -0 -6.54546 Td -(2052 lgdt\(c->gdt, sizeof c->gdt\);) 21.07 Tj -0 -7.85455 Td -(2053 ltr\(SEG_TSS << 3\);) 15.05 Tj -0 -9.16364 Td -(2054 }) 3.612 Tj -0 -10.4727 Td -(2055 ) 3.01 Tj -0 -11.7818 Td -(2056 // Grow current process's memory by n bytes.) 29.498 Tj -0 -13.0909 Td -(2057 // Return old size on success, -1 on failure.) 30.1 Tj -0 -14.4 Td -(2058 int) 4.816 Tj -0 -15.7091 Td -(2059 growproc\(int n\)) 12.04 Tj -0 -17.0182 Td -(2060 {) 3.612 Tj -0 -18.3273 Td -(2061 struct proc *cp = curproc[cpu\(\)];) 24.08 Tj -0 -19.6364 Td -(2062 char *newmem, *oldmem;) 17.458 Tj -0 -20.9455 Td -(2063 ) 3.01 Tj -0 -22.2545 Td -(2064 newmem = kalloc\(cp->sz + n\);) 21.07 Tj -0 -23.5636 Td -(2065 if\(newmem == 0\)) 13.244 Tj -0 -24.8727 Td -(2066 return 0xffffffff;) 16.254 Tj -0 -26.1818 Td -(2067 memmove\(newmem, cp->mem, cp->sz\);) 24.08 Tj -0 -27.4909 Td -(2068 memset\(newmem + cp->sz, 0, n\);) 22.274 Tj -0 -28.8 Td -(2069 oldmem = cp->mem;) 14.448 Tj -0 -30.1091 Td -(2070 cp->mem = newmem;) 14.448 Tj -0 -31.4182 Td -(2071 kfree\(oldmem, cp->sz\);) 17.458 Tj -0 -32.7273 Td -(2072 cp->sz += n;) 11.438 Tj -0 -34.0364 Td -(2073 return cp->sz - n;) 15.05 Tj -0 -35.3454 Td -(2074 }) 3.612 Tj -0 -36.6545 Td -(2075 ) 3.01 Tj -0 -37.9636 Td -(2076 // Look in the process table for an UNUSED proc.) 31.906 Tj -0 -39.2727 Td -(2077 // If found, change state to EMBRYO and return it.) 33.11 Tj -0 -40.5818 Td -(2078 // Otherwise return 0.) 16.254 Tj -0 -41.8909 Td -(2079 struct proc*) 10.234 Tj -0 -43.2 Td -(2080 allocproc\(void\)) 12.04 Tj -0 -44.5091 Td -(2081 {) 3.612 Tj -0 -45.8182 Td -(2082 int i;) 7.826 Tj -0 -47.1272 Td -(2083 struct proc *p;) 13.244 Tj -0 -48.4363 Td -(2084 ) 3.01 Tj -0 -49.7454 Td -(2085 for\(i = 0; i < NPROC; i++\){) 20.468 Tj -0 -51.0545 Td -(2086 p = &proc[i];) 13.244 Tj -0 -52.3636 Td -(2087 if\(p->state == UNUSED\){) 19.264 Tj -0 -53.6727 Td -(2088 p->state = EMBRYO;) 17.458 Tj -0 -54.9818 Td -(2089 return p;) 12.04 Tj -0 -56.2909 Td -(2090 }) 6.02 Tj -0 -57.6 Td -(2091 }) 4.816 Tj -0 -58.9091 Td -(2092 return 0;) 9.632 Tj -0 -60.2181 Td -(2093 }) 3.612 Tj -0 -61.5272 Td -(2094 ) 3.01 Tj -0 -62.8363 Td -(2095 ) 3.01 Tj -0 -64.1454 Td -(2096 ) 3.01 Tj -0 -65.4545 Td -(2097 ) 3.01 Tj -0 -66.7636 Td -(2098 ) 3.01 Tj -0 -68.0727 Td -(2099 ) 3.01 Tj -0 -72 Td -(Sheet 20) 4.816 Tj +/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 @@ -8768,7 +9327,10 @@ pdfEndPage %%Page: 28 28 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -8776,241 +9338,256 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 3) 22.274 Tj -0 -3.92728 Td -(2100 // Create a new process copying p as the parent.) 31.906 Tj -0 -5.23637 Td -(2101 // Does not copy the kernel stack.) 23.478 Tj -0 -6.54546 Td -(2102 // Instead, sets up stack to return as if from system call.) 38.528 Tj -0 -7.85455 Td -(2103 // Caller must arrange for process to run \(set state to RUNNABLE\).) 42.742 Tj -0 -9.16364 Td -(2104 struct proc*) 10.234 Tj -0 -10.4727 Td -(2105 copyproc\(struct proc *p\)) 17.458 Tj -0 -11.7818 Td -(2106 {) 3.612 Tj -0 -13.0909 Td -(2107 int i;) 7.826 Tj -0 -14.4 Td -(2108 struct proc *np;) 13.846 Tj -0 -15.7091 Td -(2109 ) 3.01 Tj -0 -17.0182 Td -(2110 // Allocate process.) 16.254 Tj -0 -18.3273 Td -(2111 acquire\(&proc_table_lock\);) 19.866 Tj -0 -19.6364 Td -(2112 if\(\(np = allocproc\(\)\) == 0\){) 21.07 Tj -0 -20.9455 Td -(2113 release\(&proc_table_lock\);) 21.07 Tj -0 -22.2545 Td -(2114 return 0;) 10.836 Tj -0 -23.5636 Td -(2115 }) 4.816 Tj -0 -24.8727 Td -(2116 np->pid = next_pid++;) 16.856 Tj -0 -26.1818 Td -(2117 np->ppid = p->pid;) 15.05 Tj -0 -27.4909 Td -(2118 release\(&proc_table_lock\);) 19.866 Tj -0 -28.8 Td -(2119 ) 3.01 Tj -0 -30.1091 Td -(2120 // Copy user memory.) 16.254 Tj -0 -31.4182 Td -(2121 np->sz = p->sz;) 13.244 Tj -0 -32.7273 Td -(2122 np->mem = kalloc\(np->sz\);) 19.264 Tj -0 -34.0364 Td -(2123 if\(np->mem == 0\){) 14.448 Tj -0 -35.3454 Td -(2124 np->state = UNUSED;) 16.856 Tj -0 -36.6545 Td -(2125 return 0;) 10.836 Tj -0 -37.9636 Td -(2126 }) 4.816 Tj -0 -39.2727 Td -(2127 memmove\(np->mem, p->mem, np->sz\);) 24.08 Tj -0 -40.5818 Td -(2128 ) 3.01 Tj -0 -41.8909 Td -(2129 // Allocate kernel stack.) 19.264 Tj -0 -43.2 Td -(2130 np->kstack = kalloc\(KSTACKSIZE\);) 23.478 Tj -0 -44.5091 Td -(2131 if\(np->kstack == 0\){) 16.254 Tj -0 -45.8182 Td -(2132 kfree\(np->mem, np->sz\);) 19.264 Tj -0 -47.1272 Td -(2133 np->mem = 0;) 12.642 Tj -0 -48.4363 Td -(2134 np->state = UNUSED;) 16.856 Tj -0 -49.7454 Td -(2135 return 0;) 10.836 Tj -0 -51.0545 Td -(2136 }) 4.816 Tj -0 -52.3636 Td -(2137 ) 3.01 Tj -0 -53.6727 Td -(2138 // Copy trapframe registers from parent.) 28.294 Tj -0 -54.9818 Td -(2139 np->tf = \(struct trapframe*\)\(np->kstack + KSTACKSIZE\) - 1;) 39.13 Tj -0 -56.2909 Td -(2140 memmove\(np->tf, p->tf, sizeof\(*np->tf\)\);) 28.294 Tj -0 -57.6 Td -(2141 ) 3.01 Tj -0 -58.9091 Td -(2142 // Clear %eax so that fork system call returns 0 in child.) 39.13 Tj -0 -60.2181 Td -(2143 np->tf->eax = 0;) 13.846 Tj -0 -61.5272 Td -(2144 ) 3.01 Tj -0 -62.8363 Td -(2145 // Set up new jmpbuf to start executing at forkret \(see below\).) 42.14 Tj -0 -64.1454 Td -(2146 memset\(&np->jmpbuf, 0, sizeof np->jmpbuf\);) 29.498 Tj -0 -65.4545 Td -(2147 np->jmpbuf.eip = \(uint\)forkret;) 22.876 Tj -0 -66.7636 Td -(2148 np->jmpbuf.esp = \(uint\)np->tf - 4;) 24.682 Tj -0 -68.0727 Td -(2149 ) 3.01 Tj -0 -72 Td -(Sheet 21) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 4) 22.274 Tj -0 -3.92728 Td -(2150 // Copy file descriptors) 18.662 Tj -0 -5.23637 Td -(2151 for\(i = 0; i < NOFILE; i++\){) 21.07 Tj -0 -6.54546 Td -(2152 np->ofile[i] = p->ofile[i];) 21.672 Tj -0 -7.85455 Td -(2153 if\(np->ofile[i]\)) 15.05 Tj -0 -9.16364 Td -(2154 fileincref\(np->ofile[i]\);) 21.672 Tj -0 -10.4727 Td -(2155 }) 4.816 Tj -0 -11.7818 Td -(2156 ) 3.01 Tj -0 -13.0909 Td -(2157 np->cwd = p->cwd;) 14.448 Tj -0 -14.4 Td -(2158 iincref\(p->cwd\);) 13.846 Tj -0 -15.7091 Td -(2159 ) 3.01 Tj -0 -17.0182 Td -(2160 return np;) 10.234 Tj -0 -18.3273 Td -(2161 }) 3.612 Tj -0 -19.6364 Td -(2162 ) 3.01 Tj -0 -20.9455 Td -(2163 ) 3.01 Tj -0 -22.2545 Td -(2164 ) 3.01 Tj -0 -23.5636 Td -(2165 ) 3.01 Tj -0 -24.8727 Td -(2166 ) 3.01 Tj -0 -26.1818 Td -(2167 ) 3.01 Tj -0 -27.4909 Td -(2168 ) 3.01 Tj -0 -28.8 Td -(2169 ) 3.01 Tj -0 -30.1091 Td -(2170 ) 3.01 Tj -0 -31.4182 Td -(2171 ) 3.01 Tj -0 -32.7273 Td -(2172 ) 3.01 Tj -0 -34.0364 Td -(2173 ) 3.01 Tj -0 -35.3454 Td -(2174 ) 3.01 Tj -0 -36.6545 Td -(2175 ) 3.01 Tj -0 -37.9636 Td -(2176 ) 3.01 Tj -0 -39.2727 Td -(2177 ) 3.01 Tj -0 -40.5818 Td -(2178 ) 3.01 Tj -0 -41.8909 Td -(2179 ) 3.01 Tj -0 -43.2 Td -(2180 ) 3.01 Tj -0 -44.5091 Td -(2181 ) 3.01 Tj -0 -45.8182 Td -(2182 ) 3.01 Tj -0 -47.1272 Td -(2183 ) 3.01 Tj -0 -48.4363 Td -(2184 ) 3.01 Tj -0 -49.7454 Td -(2185 ) 3.01 Tj -0 -51.0545 Td -(2186 ) 3.01 Tj -0 -52.3636 Td -(2187 ) 3.01 Tj -0 -53.6727 Td -(2188 ) 3.01 Tj -0 -54.9818 Td -(2189 ) 3.01 Tj -0 -56.2909 Td -(2190 ) 3.01 Tj -0 -57.6 Td -(2191 ) 3.01 Tj -0 -58.9091 Td -(2192 ) 3.01 Tj -0 -60.2181 Td -(2193 ) 3.01 Tj -0 -61.5272 Td -(2194 ) 3.01 Tj -0 -62.8363 Td -(2195 ) 3.01 Tj -0 -64.1454 Td -(2196 ) 3.01 Tj -0 -65.4545 Td -(2197 ) 3.01 Tj -0 -66.7636 Td -(2198 ) 3.01 Tj -0 -68.0727 Td -(2199 ) 3.01 Tj -0 -72 Td -(Sheet 21) 4.816 Tj +/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 @@ -9022,6 +9599,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -9029,241 +9609,260 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 5) 22.274 Tj -0 -3.92728 Td -(2200 // Per-CPU process scheduler.) 20.468 Tj -0 -5.23637 Td -(2201 // Each CPU calls scheduler\(\) after setting itself up.) 35.518 Tj -0 -6.54546 Td -(2202 // Scheduler never returns. It loops, doing:) 30.1 Tj -0 -7.85455 Td -(2203 // - choose a process to run) 20.468 Tj -0 -9.16364 Td -(2204 // - longjmp to start running that process) 28.896 Tj -0 -10.4727 Td -(2205 // - eventually that process transfers control back) 34.314 Tj -0 -11.7818 Td -(2206 // via longjmp back to the top of scheduler.) 32.508 Tj -0 -13.0909 Td -(2207 void) 5.418 Tj -0 -14.4 Td -(2208 scheduler\(void\)) 12.04 Tj -0 -15.7091 Td -(2209 {) 3.612 Tj -0 -17.0182 Td -(2210 struct proc *p;) 13.244 Tj -0 -18.3273 Td -(2211 int i;) 7.826 Tj -0 -19.6364 Td -(2212 ) 3.01 Tj -0 -20.9455 Td -(2213 for\(;;\){) 9.03 Tj -0 -22.2545 Td -(2214 // Loop over process table looking for process to run.) 37.926 Tj -0 -23.5636 Td -(2215 acquire\(&proc_table_lock\);) 21.07 Tj -0 -24.8727 Td -(2216 ) 3.01 Tj -0 -26.1818 Td -(2217 for\(i = 0; i < NPROC; i++\){) 21.672 Tj -0 -27.4909 Td -(2218 p = &proc[i];) 14.448 Tj -0 -28.8 Td -(2219 if\(p->state != RUNNABLE\)) 21.07 Tj -0 -30.1091 Td -(2220 continue;) 13.244 Tj -0 -31.4182 Td -(2221 ) 3.01 Tj -0 -32.7273 Td -(2222 // Switch to chosen process. It is the process's job) 38.528 Tj -0 -34.0364 Td -(2223 // to release proc_table_lock and then reacquire it) 37.324 Tj -0 -35.3454 Td -(2224 // before jumping back to us.) 24.08 Tj -0 -36.6545 Td -(2225 ) 3.01 Tj -0 -37.9636 Td -(2226 setupsegs\(p\);) 14.448 Tj -0 -39.2727 Td -(2227 curproc[cpu\(\)] = p;) 18.06 Tj -0 -40.5818 Td -(2228 p->state = RUNNING;) 18.06 Tj -0 -41.8909 Td -(2229 if\(setjmp\(&cpus[cpu\(\)].jmpbuf\) == 0\)) 28.294 Tj -0 -43.2 Td -(2230 longjmp\(&p->jmpbuf\);) 19.866 Tj -0 -44.5091 Td -(2231 ) 3.01 Tj -0 -45.8182 Td -(2232 // Process is done running for now.) 27.692 Tj -0 -47.1272 Td -(2233 // It should have changed its p->state before coming back.) 41.538 Tj -0 -48.4363 Td -(2234 curproc[cpu\(\)] = 0;) 18.06 Tj -0 -49.7454 Td -(2235 ) 3.01 Tj -0 -51.0545 Td -(2236 setupsegs\(0\);) 14.448 Tj -0 -52.3636 Td -(2237 }) 6.02 Tj -0 -53.6727 Td -(2238 ) 3.01 Tj -0 -54.9818 Td -(2239 release\(&proc_table_lock\);) 21.07 Tj -0 -56.2909 Td -(2240 }) 4.816 Tj -0 -57.6 Td -(2241 }) 3.612 Tj -0 -58.9091 Td -(2242 ) 3.01 Tj -0 -60.2181 Td -(2243 ) 3.01 Tj -0 -61.5272 Td -(2244 ) 3.01 Tj -0 -62.8363 Td -(2245 ) 3.01 Tj -0 -64.1454 Td -(2246 ) 3.01 Tj -0 -65.4545 Td -(2247 ) 3.01 Tj -0 -66.7636 Td -(2248 ) 3.01 Tj -0 -68.0727 Td -(2249 ) 3.01 Tj -0 -72 Td -(Sheet 22) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 6) 22.274 Tj -0 -3.92728 Td -(2250 // Enter scheduler. Must already hold proc_table_lock) 35.518 Tj -0 -5.23637 Td -(2251 // and have changed curproc[cpu\(\)]->state.) 28.294 Tj -0 -6.54546 Td -(2252 void) 5.418 Tj -0 -7.85455 Td -(2253 sched\(void\)) 9.632 Tj -0 -9.16364 Td -(2254 {) 3.612 Tj -0 -10.4727 Td -(2255 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -11.7818 Td -(2256 ) 3.01 Tj -0 -13.0909 Td -(2257 if\(!holding\(&proc_table_lock\)\)) 22.274 Tj -0 -14.4 Td -(2258 panic\("sched"\);) 14.448 Tj -0 -15.7091 Td -(2259 if\(cpus[cpu\(\)].nlock != 1\)) 19.866 Tj -0 -17.0182 Td -(2260 panic\("sched locks"\);) 18.06 Tj -0 -18.3273 Td -(2261 ) 3.01 Tj -0 -19.6364 Td -(2262 if\(setjmp\(&p->jmpbuf\) == 0\)) 20.468 Tj -0 -20.9455 Td -(2263 longjmp\(&cpus[cpu\(\)].jmpbuf\);) 22.876 Tj -0 -22.2545 Td -(2264 }) 3.612 Tj -0 -23.5636 Td -(2265 ) 3.01 Tj -0 -24.8727 Td -(2266 // Give up the CPU for one scheduling round.) 29.498 Tj -0 -26.1818 Td -(2267 void) 5.418 Tj -0 -27.4909 Td -(2268 yield\(void\)) 9.632 Tj -0 -28.8 Td -(2269 {) 3.612 Tj -0 -30.1091 Td -(2270 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -31.4182 Td -(2271 ) 3.01 Tj -0 -32.7273 Td -(2272 acquire\(&proc_table_lock\);) 19.866 Tj -0 -34.0364 Td -(2273 p->state = RUNNABLE;) 16.254 Tj -0 -35.3454 Td -(2274 sched\(\);) 9.03 Tj -0 -36.6545 Td -(2275 release\(&proc_table_lock\);) 19.866 Tj -0 -37.9636 Td -(2276 }) 3.612 Tj -0 -39.2727 Td -(2277 ) 3.01 Tj -0 -40.5818 Td -(2278 // A fork child's very first scheduling by scheduler\(\)) 35.518 Tj -0 -41.8909 Td -(2279 // will longjmp here. "return" to user space.) 30.1 Tj -0 -43.2 Td -(2280 void) 5.418 Tj -0 -44.5091 Td -(2281 forkret\(void\)) 10.836 Tj -0 -45.8182 Td -(2282 {) 3.612 Tj -0 -47.1272 Td -(2283 // Still holding proc_table_lock from scheduler.) 33.11 Tj -0 -48.4363 Td -(2284 release\(&proc_table_lock\);) 19.866 Tj -0 -49.7454 Td -(2285 ) 3.01 Tj -0 -51.0545 Td -(2286 // Jump into assembly, never to return.) 27.692 Tj -0 -52.3636 Td -(2287 forkret1\(curproc[cpu\(\)]->tf\);) 21.672 Tj -0 -53.6727 Td -(2288 }) 3.612 Tj -0 -54.9818 Td -(2289 ) 3.01 Tj -0 -56.2909 Td -(2290 ) 3.01 Tj -0 -57.6 Td -(2291 ) 3.01 Tj -0 -58.9091 Td -(2292 ) 3.01 Tj -0 -60.2181 Td -(2293 ) 3.01 Tj -0 -61.5272 Td -(2294 ) 3.01 Tj -0 -62.8363 Td -(2295 ) 3.01 Tj -0 -64.1454 Td -(2296 ) 3.01 Tj -0 -65.4545 Td -(2297 ) 3.01 Tj -0 -66.7636 Td -(2298 ) 3.01 Tj -0 -68.0727 Td -(2299 ) 3.01 Tj -0 -72 Td -(Sheet 22) 4.816 Tj +/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 @@ -9274,7 +9873,10 @@ pdfEndPage %%Page: 30 30 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -9282,241 +9884,259 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 7) 22.274 Tj -0 -3.92728 Td -(2300 // Atomically release lock and sleep on chan.) 30.1 Tj -0 -5.23637 Td -(2301 // Reacquires lock when reawakened.) 24.08 Tj -0 -6.54546 Td -(2302 void) 5.418 Tj -0 -7.85455 Td -(2303 sleep\(void *chan, struct spinlock *lk\)) 25.886 Tj -0 -9.16364 Td -(2304 {) 3.612 Tj -0 -10.4727 Td -(2305 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -11.7818 Td -(2306 ) 3.01 Tj -0 -13.0909 Td -(2307 if\(p == 0\)) 10.234 Tj -0 -14.4 Td -(2308 panic\("sleep"\);) 14.448 Tj -0 -15.7091 Td -(2309 ) 3.01 Tj -0 -17.0182 Td -(2310 if\(lk == 0\)) 10.836 Tj -0 -18.3273 Td -(2311 panic\("sleep without lk"\);) 21.07 Tj -0 -19.6364 Td -(2312 ) 3.01 Tj -0 -20.9455 Td -(2313 // Must acquire proc_table_lock in order to) 30.1 Tj -0 -22.2545 Td -(2314 // change p->state and then call sched.) 27.692 Tj -0 -23.5636 Td -(2315 // Once we hold proc_table_lock, we can be) 29.498 Tj -0 -24.8727 Td -(2316 // guaranteed that we won't miss any wakeup) 30.1 Tj -0 -26.1818 Td -(2317 // \(wakeup runs with proc_table_lock locked\),) 31.304 Tj -0 -27.4909 Td -(2318 // so it's okay to release lk.) 22.274 Tj -0 -28.8 Td -(2319 if\(lk != &proc_table_lock\){) 20.468 Tj -0 -30.1091 Td -(2320 acquire\(&proc_table_lock\);) 21.07 Tj -0 -31.4182 Td -(2321 release\(lk\);) 12.642 Tj -0 -32.7273 Td -(2322 }) 4.816 Tj -0 -34.0364 Td -(2323 ) 3.01 Tj -0 -35.3454 Td -(2324 // Go to sleep.) 13.244 Tj -0 -36.6545 Td -(2325 p->chan = chan;) 13.244 Tj -0 -37.9636 Td -(2326 p->state = SLEEPING;) 16.254 Tj -0 -39.2727 Td -(2327 sched\(\);) 9.03 Tj -0 -40.5818 Td -(2328 ) 3.01 Tj -0 -41.8909 Td -(2329 // Tidy up.) 10.836 Tj -0 -43.2 Td -(2330 p->chan = 0;) 11.438 Tj -0 -44.5091 Td -(2331 ) 3.01 Tj -0 -45.8182 Td -(2332 // Reacquire original lock.) 20.468 Tj -0 -47.1272 Td -(2333 if\(lk != &proc_table_lock\){) 20.468 Tj -0 -48.4363 Td -(2334 release\(&proc_table_lock\);) 21.07 Tj -0 -49.7454 Td -(2335 acquire\(lk\);) 12.642 Tj -0 -51.0545 Td -(2336 }) 4.816 Tj -0 -52.3636 Td -(2337 }) 3.612 Tj -0 -53.6727 Td -(2338 ) 3.01 Tj -0 -54.9818 Td -(2339 // Wake up all processes sleeping on chan.) 28.294 Tj -0 -56.2909 Td -(2340 // Proc_table_lock must be held.) 22.274 Tj -0 -57.6 Td -(2341 void) 5.418 Tj -0 -58.9091 Td -(2342 wakeup1\(void *chan\)) 14.448 Tj -0 -60.2181 Td -(2343 {) 3.612 Tj -0 -61.5272 Td -(2344 struct proc *p;) 13.244 Tj -0 -62.8363 Td -(2345 ) 3.01 Tj -0 -64.1454 Td -(2346 for\(p = proc; p < &proc[NPROC]; p++\)) 25.886 Tj -0 -65.4545 Td -(2347 if\(p->state == SLEEPING && p->chan == chan\)) 31.304 Tj -0 -66.7636 Td -(2348 p->state = RUNNABLE;) 18.662 Tj -0 -68.0727 Td -(2349 }) 3.612 Tj -0 -72 Td -(Sheet 23) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 8) 22.274 Tj -0 -3.92728 Td -(2350 // Wake up all processes sleeping on chan.) 28.294 Tj -0 -5.23637 Td -(2351 // Proc_table_lock is acquired and released.) 29.498 Tj -0 -6.54546 Td -(2352 void) 5.418 Tj -0 -7.85455 Td -(2353 wakeup\(void *chan\)) 13.846 Tj -0 -9.16364 Td -(2354 {) 3.612 Tj -0 -10.4727 Td -(2355 acquire\(&proc_table_lock\);) 19.866 Tj -0 -11.7818 Td -(2356 wakeup1\(chan\);) 12.642 Tj -0 -13.0909 Td -(2357 release\(&proc_table_lock\);) 19.866 Tj -0 -14.4 Td -(2358 }) 3.612 Tj -0 -15.7091 Td -(2359 ) 3.01 Tj -0 -17.0182 Td -(2360 // Kill the process with the given pid.) 26.488 Tj -0 -18.3273 Td -(2361 // Process won't actually exit until it returns) 31.304 Tj -0 -19.6364 Td -(2362 // to user space \(see trap in trap.c\).) 25.886 Tj -0 -20.9455 Td -(2363 int) 4.816 Tj -0 -22.2545 Td -(2364 proc_kill\(int pid\)) 13.846 Tj -0 -23.5636 Td -(2365 {) 3.612 Tj -0 -24.8727 Td -(2366 struct proc *p;) 13.244 Tj -0 -26.1818 Td -(2367 ) 3.01 Tj -0 -27.4909 Td -(2368 acquire\(&proc_table_lock\);) 19.866 Tj -0 -28.8 Td -(2369 for\(p = proc; p < &proc[NPROC]; p++\){) 26.488 Tj -0 -30.1091 Td -(2370 if\(p->pid == pid\){) 16.254 Tj -0 -31.4182 Td -(2371 p->killed = 1;) 15.05 Tj -0 -32.7273 Td -(2372 // Wake process from sleep if necessary.) 30.702 Tj -0 -34.0364 Td -(2373 if\(p->state == SLEEPING\)) 21.07 Tj -0 -35.3454 Td -(2374 p->state = RUNNABLE;) 19.866 Tj -0 -36.6545 Td -(2375 release\(&proc_table_lock\);) 22.274 Tj -0 -37.9636 Td -(2376 return 0;) 12.04 Tj -0 -39.2727 Td -(2377 }) 6.02 Tj -0 -40.5818 Td -(2378 }) 4.816 Tj -0 -41.8909 Td -(2379 release\(&proc_table_lock\);) 19.866 Tj -0 -43.2 Td -(2380 return -1;) 10.234 Tj -0 -44.5091 Td -(2381 }) 3.612 Tj -0 -45.8182 Td -(2382 ) 3.01 Tj -0 -47.1272 Td -(2383 // Exit the current process. Does not return.) 30.702 Tj -0 -48.4363 Td -(2384 // Exited processes remain in the zombie state) 30.702 Tj -0 -49.7454 Td -(2385 // until their parent calls wait\(\) to find out they exited.) 38.528 Tj -0 -51.0545 Td -(2386 void) 5.418 Tj -0 -52.3636 Td -(2387 proc_exit\(void\)) 12.04 Tj -0 -53.6727 Td -(2388 {) 3.612 Tj -0 -54.9818 Td -(2389 struct proc *p;) 13.244 Tj -0 -56.2909 Td -(2390 struct proc *cp = curproc[cpu\(\)];) 24.08 Tj -0 -57.6 Td -(2391 int fd;) 8.428 Tj -0 -58.9091 Td -(2392 ) 3.01 Tj -0 -60.2181 Td -(2393 // Close all open files.) 18.662 Tj -0 -61.5272 Td -(2394 for\(fd = 0; fd < NOFILE; fd++\){) 22.876 Tj -0 -62.8363 Td -(2395 if\(cp->ofile[fd]\){) 16.254 Tj -0 -64.1454 Td -(2396 fileclose\(cp->ofile[fd]\);) 21.672 Tj -0 -65.4545 Td -(2397 cp->ofile[fd] = 0;) 17.458 Tj -0 -66.7636 Td -(2398 }) 6.02 Tj -0 -68.0727 Td -(2399 }) 4.816 Tj -0 -72 Td -(Sheet 23) 4.816 Tj +/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 @@ -9528,6 +10148,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -9535,241 +10158,253 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 9) 22.274 Tj -0 -3.92728 Td -(2400 idecref\(cp->cwd\);) 14.448 Tj -0 -5.23637 Td -(2401 cp->cwd = 0;) 11.438 Tj -0 -6.54546 Td -(2402 ) 3.01 Tj -0 -7.85455 Td -(2403 acquire\(&proc_table_lock\);) 19.866 Tj -0 -9.16364 Td -(2404 ) 3.01 Tj -0 -10.4727 Td -(2405 // Wake up our parent.) 17.458 Tj -0 -11.7818 Td -(2406 for\(p = proc; p < &proc[NPROC]; p++\)) 25.886 Tj -0 -13.0909 Td -(2407 if\(p->pid == cp->ppid\)) 18.662 Tj -0 -14.4 Td -(2408 wakeup1\(p\);) 13.244 Tj -0 -15.7091 Td -(2409 ) 3.01 Tj -0 -17.0182 Td -(2410 // Reparent our children to process 1.) 27.09 Tj -0 -18.3273 Td -(2411 for\(p = proc; p < &proc[NPROC]; p++\)) 25.886 Tj -0 -19.6364 Td -(2412 if\(p->ppid == cp->pid\)) 18.662 Tj -0 -20.9455 Td -(2413 p->ppid = 1;) 13.846 Tj -0 -22.2545 Td -(2414 ) 3.01 Tj -0 -23.5636 Td -(2415 // Jump into the scheduler, never to return.) 30.702 Tj -0 -24.8727 Td -(2416 cp->killed = 0;) 13.244 Tj -0 -26.1818 Td -(2417 cp->state = ZOMBIE;) 15.652 Tj -0 -27.4909 Td -(2418 sched\(\);) 9.03 Tj -0 -28.8 Td -(2419 panic\("zombie exit"\);) 16.856 Tj -0 -30.1091 Td -(2420 }) 3.612 Tj -0 -31.4182 Td -(2421 ) 3.01 Tj -0 -32.7273 Td -(2422 // Wait for a child process to exit and return its pid.) 36.12 Tj -0 -34.0364 Td -(2423 // Return -1 if this process has no children.) 30.1 Tj -0 -35.3454 Td -(2424 int) 4.816 Tj -0 -36.6545 Td -(2425 proc_wait\(void\)) 12.04 Tj -0 -37.9636 Td -(2426 {) 3.612 Tj -0 -39.2727 Td -(2427 struct proc *p;) 13.244 Tj -0 -40.5818 Td -(2428 struct proc *cp = curproc[cpu\(\)];) 24.08 Tj -0 -41.8909 Td -(2429 int i, havekids, pid;) 16.856 Tj -0 -43.2 Td -(2430 ) 3.01 Tj -0 -44.5091 Td -(2431 acquire\(&proc_table_lock\);) 19.866 Tj -0 -45.8182 Td -(2432 for\(;;\){) 9.03 Tj -0 -47.1272 Td -(2433 // Scan through table looking for zombie children.) 35.518 Tj -0 -48.4363 Td -(2434 havekids = 0;) 13.244 Tj -0 -49.7454 Td -(2435 for\(i = 0; i < NPROC; i++\){) 21.672 Tj -0 -51.0545 Td -(2436 p = &proc[i];) 14.448 Tj -0 -52.3636 Td -(2437 if\(p->state == UNUSED\)) 19.866 Tj -0 -53.6727 Td -(2438 continue;) 13.244 Tj -0 -54.9818 Td -(2439 if\(p->ppid == cp->pid\){) 20.468 Tj -0 -56.2909 Td -(2440 if\(p->state == ZOMBIE\){) 21.672 Tj -0 -57.6 Td -(2441 // Found one.) 16.856 Tj -0 -58.9091 Td -(2442 kfree\(p->mem, p->sz\);) 21.672 Tj -0 -60.2181 Td -(2443 kfree\(p->kstack, KSTACKSIZE\);) 26.488 Tj -0 -61.5272 Td -(2444 pid = p->pid;) 16.856 Tj -0 -62.8363 Td -(2445 p->state = UNUSED;) 19.866 Tj -0 -64.1454 Td -(2446 p->pid = 0;) 15.652 Tj -0 -65.4545 Td -(2447 p->ppid = 0;) 16.254 Tj -0 -66.7636 Td -(2448 release\(&proc_table_lock\);) 24.682 Tj -0 -68.0727 Td -(2449 return pid;) 15.652 Tj -0 -72 Td -(Sheet 24) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/proc.c Page 10) 22.876 Tj -0 -3.92728 Td -(2450 }) 8.428 Tj -0 -5.23637 Td -(2451 havekids = 1;) 15.652 Tj -0 -6.54546 Td -(2452 }) 7.224 Tj -0 -7.85455 Td -(2453 }) 6.02 Tj -0 -9.16364 Td -(2454 ) 3.01 Tj -0 -10.4727 Td -(2455 // No point waiting if we don't have any children.) 35.518 Tj -0 -11.7818 Td -(2456 if\(!havekids\){) 13.846 Tj -0 -13.0909 Td -(2457 release\(&proc_table_lock\);) 22.274 Tj -0 -14.4 Td -(2458 return -1;) 12.642 Tj -0 -15.7091 Td -(2459 }) 6.02 Tj -0 -17.0182 Td -(2460 ) 3.01 Tj -0 -18.3273 Td -(2461 // Wait for children to exit. \(See wakeup1 call in proc_exit.\)) 43.344 Tj -0 -19.6364 Td -(2462 sleep\(cp, &proc_table_lock\);) 22.274 Tj -0 -20.9455 Td -(2463 }) 4.816 Tj -0 -22.2545 Td -(2464 }) 3.612 Tj -0 -23.5636 Td -(2465 ) 3.01 Tj -0 -24.8727 Td -(2466 // Print a process listing to console. For debugging.) 35.518 Tj -0 -26.1818 Td -(2467 // Runs when user types ^P on console.) 25.886 Tj -0 -27.4909 Td -(2468 // No lock to avoid wedging a stuck machine further.) 34.314 Tj -0 -28.8 Td -(2469 void) 5.418 Tj -0 -30.1091 Td -(2470 procdump\(void\)) 11.438 Tj -0 -31.4182 Td -(2471 {) 3.612 Tj -0 -32.7273 Td -(2472 int i;) 7.826 Tj -0 -34.0364 Td -(2473 struct proc *p;) 13.244 Tj -0 -35.3454 Td -(2474 ) 3.01 Tj -0 -36.6545 Td -(2475 for\(i = 0; i < NPROC; i++\) {) 21.07 Tj -0 -37.9636 Td -(2476 p = &proc[i];) 13.244 Tj -0 -39.2727 Td -(2477 if\(p->state == UNUSED\)) 18.662 Tj -0 -40.5818 Td -(2478 continue;) 12.04 Tj -0 -41.8909 Td -(2479 cprintf\("%d %d %p\\n", p->pid, p->state\);) 29.498 Tj -0 -43.2 Td -(2480 }) 4.816 Tj -0 -44.5091 Td -(2481 }) 3.612 Tj -0 -45.8182 Td -(2482 ) 3.01 Tj -0 -47.1272 Td -(2483 ) 3.01 Tj -0 -48.4363 Td -(2484 ) 3.01 Tj -0 -49.7454 Td -(2485 ) 3.01 Tj -0 -51.0545 Td -(2486 ) 3.01 Tj -0 -52.3636 Td -(2487 ) 3.01 Tj -0 -53.6727 Td -(2488 ) 3.01 Tj -0 -54.9818 Td -(2489 ) 3.01 Tj -0 -56.2909 Td -(2490 ) 3.01 Tj -0 -57.6 Td -(2491 ) 3.01 Tj -0 -58.9091 Td -(2492 ) 3.01 Tj -0 -60.2181 Td -(2493 ) 3.01 Tj -0 -61.5272 Td -(2494 ) 3.01 Tj -0 -62.8363 Td -(2495 ) 3.01 Tj -0 -64.1454 Td -(2496 ) 3.01 Tj -0 -65.4545 Td -(2497 ) 3.01 Tj -0 -66.7636 Td -(2498 ) 3.01 Tj -0 -68.0727 Td -(2499 ) 3.01 Tj -0 -72 Td -(Sheet 24) 4.816 Tj +/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 @@ -9780,7 +10415,10 @@ pdfEndPage %%Page: 32 32 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -9788,241 +10426,264 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/setjmp.S Page 1) 23.478 Tj -0 -3.92728 Td -(2500 # int setjmp\(struct jmpbuf *jmp\);) 24.682 Tj -0 -5.23637 Td -(2501 # void longjmp\(struct jmpbuf *jmp\);) 25.284 Tj -0 -6.54546 Td -(2502 #) 3.612 Tj -0 -7.85455 Td -(2503 # Setjmp saves its stack environment in jmp for later use by longjmp.) 44.548 Tj -0 -9.16364 Td -(2504 # It returns 0.) 12.04 Tj -0 -10.4727 Td -(2505 #) 3.612 Tj -0 -11.7818 Td -(2506 # Longjmp restores the environment saved by the last call of setjmp.) 43.946 Tj -0 -13.0909 Td -(2507 # It then causes execution to continue as if the call of setjmp) 40.936 Tj -0 -14.4 Td -(2508 # had just returned 1.) 16.254 Tj -0 -15.7091 Td -(2509 #) 3.612 Tj -0 -17.0182 Td -(2510 # The caller of setjmp must not itself have returned in the interim.) 43.946 Tj -0 -18.3273 Td -(2511 # All accessible data have values as of the time longjmp was called.) 43.946 Tj -0 -19.6364 Td -(2512 #) 3.612 Tj -0 -20.9455 Td -(2513 # [Description, but not code, borrowed from Plan 9.]) 36.12 Tj -0 -22.2545 Td -(2514 ) 3.01 Tj -0 -23.5636 Td -(2515 .globl setjmp) 10.836 Tj -0 -24.8727 Td -(2516 setjmp:) 7.224 Tj -0 -26.1818 Td -(2517 movl 4\(%esp\), %eax) 15.05 Tj -0 -27.4909 Td -(2518 ) 3.01 Tj -0 -28.8 Td -(2519 movl %ebx, 0\(%eax\)) 15.05 Tj -0 -30.1091 Td -(2520 movl %ecx, 4\(%eax\)) 15.05 Tj -0 -31.4182 Td -(2521 movl %edx, 8\(%eax\)) 15.05 Tj -0 -32.7273 Td -(2522 movl %esi, 12\(%eax\)) 15.652 Tj -0 -34.0364 Td -(2523 movl %edi, 16\(%eax\)) 15.652 Tj -0 -35.3454 Td -(2524 movl %esp, 20\(%eax\)) 15.652 Tj -0 -36.6545 Td -(2525 movl %ebp, 24\(%eax\)) 15.652 Tj -0 -37.9636 Td -(2526 pushl 0\(%esp\) # %eip) 17.458 Tj -0 -39.2727 Td -(2527 popl 28\(%eax\)) 12.04 Tj -0 -40.5818 Td -(2528 ) 3.01 Tj -0 -41.8909 Td -(2529 movl $0, %eax # return value) 22.274 Tj -0 -43.2 Td -(2530 ret) 6.02 Tj -0 -44.5091 Td -(2531 ) 3.01 Tj -0 -45.8182 Td -(2532 .globl longjmp) 11.438 Tj -0 -47.1272 Td -(2533 longjmp:) 7.826 Tj -0 -48.4363 Td -(2534 movl 4\(%esp\), %eax) 15.05 Tj -0 -49.7454 Td -(2535 ) 3.01 Tj -0 -51.0545 Td -(2536 movl 0\(%eax\), %ebx) 15.05 Tj -0 -52.3636 Td -(2537 movl 4\(%eax\), %ecx) 15.05 Tj -0 -53.6727 Td -(2538 movl 8\(%eax\), %edx) 15.05 Tj -0 -54.9818 Td -(2539 movl 12\(%eax\), %esi) 15.652 Tj -0 -56.2909 Td -(2540 movl 16\(%eax\), %edi) 15.652 Tj -0 -57.6 Td -(2541 movl 20\(%eax\), %esp) 15.652 Tj -0 -58.9091 Td -(2542 movl 24\(%eax\), %ebp) 15.652 Tj -0 -60.2181 Td -(2543 ) 3.01 Tj -0 -61.5272 Td -(2544 addl $4, %esp # pop and discard %eip) 27.09 Tj -0 -62.8363 Td -(2545 pushl 28\(%eax\) # push new %eip) 22.876 Tj -0 -64.1454 Td -(2546 ) 3.01 Tj -0 -65.4545 Td -(2547 movl $1, %eax # return value \(appears to come from setjmp!\)) 40.936 Tj -0 -66.7636 Td -(2548 ret) 6.02 Tj -0 -68.0727 Td -(2549 ) 3.01 Tj -0 -72 Td -(Sheet 25) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/kalloc.c Page 1) 23.478 Tj -0 -3.92728 Td -(2550 // Physical memory allocator, intended to allocate) 33.11 Tj -0 -5.23637 Td -(2551 // memory for user processes. Allocates in 4096-byte "pages".) 39.732 Tj -0 -6.54546 Td -(2552 // Free list is kept sorted and combines adjacent pages into) 39.13 Tj -0 -7.85455 Td -(2553 // long runs, to make it easier to allocate big segments.) 37.324 Tj -0 -9.16364 Td -(2554 // One reason the page size is 4k is that the x86 segment size) 40.334 Tj -0 -10.4727 Td -(2555 // granularity is 4k.) 15.652 Tj -0 -11.7818 Td -(2556 ) 3.01 Tj -0 -13.0909 Td -(2557 #include "param.h") 13.846 Tj -0 -14.4 Td -(2558 #include "types.h") 13.846 Tj -0 -15.7091 Td -(2559 #include "defs.h") 13.244 Tj -0 -17.0182 Td -(2560 #include "param.h") 13.846 Tj -0 -18.3273 Td -(2561 #include "mmu.h") 12.642 Tj -0 -19.6364 Td -(2562 #include "proc.h") 13.244 Tj -0 -20.9455 Td -(2563 #include "spinlock.h") 15.652 Tj -0 -22.2545 Td -(2564 ) 3.01 Tj -0 -23.5636 Td -(2565 struct spinlock kalloc_lock;) 19.866 Tj -0 -24.8727 Td -(2566 ) 3.01 Tj -0 -26.1818 Td -(2567 struct run {) 10.234 Tj -0 -27.4909 Td -(2568 struct run *next;) 14.448 Tj -0 -28.8 Td -(2569 int len; // bytes) 14.448 Tj -0 -30.1091 Td -(2570 };) 4.214 Tj -0 -31.4182 Td -(2571 struct run *freelist;) 15.652 Tj -0 -32.7273 Td -(2572 ) 3.01 Tj -0 -34.0364 Td -(2573 // Initialize free list of physical pages.) 28.294 Tj -0 -35.3454 Td -(2574 // This code cheats by just considering one megabyte of) 36.12 Tj -0 -36.6545 Td -(2575 // pages after _end. Real systems would determine the) 35.518 Tj -0 -37.9636 Td -(2576 // amount of memory available in the system and use it all.) 38.528 Tj -0 -39.2727 Td -(2577 void) 5.418 Tj -0 -40.5818 Td -(2578 kinit\(void\)) 9.632 Tj -0 -41.8909 Td -(2579 {) 3.612 Tj -0 -43.2 Td -(2580 extern int end;) 13.244 Tj -0 -44.5091 Td -(2581 uint mem;) 9.632 Tj -0 -45.8182 Td -(2582 char *start;) 11.438 Tj -0 -47.1272 Td -(2583 ) 3.01 Tj -0 -48.4363 Td -(2584 initlock\(&kalloc_lock, "kalloc"\);) 24.08 Tj -0 -49.7454 Td -(2585 start = \(char*\) &end;) 16.856 Tj -0 -51.0545 Td -(2586 start = \(char*\) \(\(\(uint\)start + PAGE\) & ~\(PAGE-1\)\);) 34.916 Tj -0 -52.3636 Td -(2587 mem = 256; // assume computer has 256 pages of RAM) 34.314 Tj -0 -53.6727 Td -(2588 cprintf\("mem = %d\\n", mem * PAGE\);) 24.682 Tj -0 -54.9818 Td -(2589 kfree\(start, mem * PAGE\);) 19.264 Tj -0 -56.2909 Td -(2590 }) 3.612 Tj -0 -57.6 Td -(2591 ) 3.01 Tj -0 -58.9091 Td -(2592 ) 3.01 Tj -0 -60.2181 Td -(2593 ) 3.01 Tj -0 -61.5272 Td -(2594 ) 3.01 Tj -0 -62.8363 Td -(2595 ) 3.01 Tj -0 -64.1454 Td -(2596 ) 3.01 Tj -0 -65.4545 Td -(2597 ) 3.01 Tj -0 -66.7636 Td -(2598 ) 3.01 Tj -0 -68.0727 Td -(2599 ) 3.01 Tj -0 -72 Td -(Sheet 25) 4.816 Tj +/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 @@ -10034,6 +10695,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -10041,241 +10705,256 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/kalloc.c Page 2) 23.478 Tj -0 -3.92728 Td -(2600 // Free the len bytes of memory pointed at by cp,) 32.508 Tj -0 -5.23637 Td -(2601 // which normally should have been returned by a) 31.906 Tj -0 -6.54546 Td -(2602 // call to kalloc\(cp\). \(The exception is when) 30.702 Tj -0 -7.85455 Td -(2603 // initializing the allocator; see kinit above.\)) 31.906 Tj -0 -9.16364 Td -(2604 void) 5.418 Tj -0 -10.4727 Td -(2605 kfree\(char *cp, int len\)) 17.458 Tj -0 -11.7818 Td -(2606 {) 3.612 Tj -0 -13.0909 Td -(2607 struct run **rr;) 13.846 Tj -0 -14.4 Td -(2608 struct run *p = \(struct run*\) cp;) 24.08 Tj -0 -15.7091 Td -(2609 struct run *pend = \(struct run*\) \(cp + len\);) 30.702 Tj -0 -17.0182 Td -(2610 int i;) 7.826 Tj -0 -18.3273 Td -(2611 ) 3.01 Tj -0 -19.6364 Td -(2612 if\(len % PAGE\)) 12.642 Tj -0 -20.9455 Td -(2613 panic\("kfree"\);) 14.448 Tj -0 -22.2545 Td -(2614 ) 3.01 Tj -0 -23.5636 Td -(2615 // Fill with junk to catch dangling refs.) 28.896 Tj -0 -24.8727 Td -(2616 for\(i = 0; i < len; i++\)) 18.662 Tj -0 -26.1818 Td -(2617 cp[i] = 1;) 11.438 Tj -0 -27.4909 Td -(2618 ) 3.01 Tj -0 -28.8 Td -(2619 acquire\(&kalloc_lock\);) 17.458 Tj -0 -30.1091 Td -(2620 ) 3.01 Tj -0 -31.4182 Td -(2621 rr = &freelist;) 13.244 Tj -0 -32.7273 Td -(2622 while\(*rr\){) 10.836 Tj -0 -34.0364 Td -(2623 struct run *rend = \(struct run*\) \(\(char*\)\(*rr\) + \(*rr\)->len\);) 42.14 Tj -0 -35.3454 Td -(2624 if\(p >= *rr && p < rend\)) 19.866 Tj -0 -36.6545 Td -(2625 panic\("freeing free page"\);) 22.876 Tj -0 -37.9636 Td -(2626 if\(pend == *rr\){) 15.05 Tj -0 -39.2727 Td -(2627 p->len = len + \(*rr\)->len;) 22.274 Tj -0 -40.5818 Td -(2628 p->next = \(*rr\)->next;) 19.866 Tj -0 -41.8909 Td -(2629 *rr = p;) 11.438 Tj -0 -43.2 Td -(2630 goto out;) 12.04 Tj -0 -44.5091 Td -(2631 }) 6.02 Tj -0 -45.8182 Td -(2632 if\(pend < *rr\){) 14.448 Tj -0 -47.1272 Td -(2633 p->len = len;) 14.448 Tj -0 -48.4363 Td -(2634 p->next = *rr;) 15.05 Tj -0 -49.7454 Td -(2635 *rr = p;) 11.438 Tj -0 -51.0545 Td -(2636 goto out;) 12.04 Tj -0 -52.3636 Td -(2637 }) 6.02 Tj -0 -53.6727 Td -(2638 if\(p == rend\){) 13.846 Tj -0 -54.9818 Td -(2639 \(*rr\)->len += len;) 17.458 Tj -0 -56.2909 Td -(2640 if\(\(*rr\)->next && \(*rr\)->next == pend\){) 30.1 Tj -0 -57.6 Td -(2641 \(*rr\)->len += \(*rr\)->next->len;) 26.488 Tj -0 -58.9091 Td -(2642 \(*rr\)->next = \(*rr\)->next->next;) 27.09 Tj -0 -60.2181 Td -(2643 }) 7.224 Tj -0 -61.5272 Td -(2644 goto out;) 12.04 Tj -0 -62.8363 Td -(2645 }) 6.02 Tj -0 -64.1454 Td -(2646 rr = &\(\(*rr\)->next\);) 17.458 Tj -0 -65.4545 Td -(2647 }) 4.816 Tj -0 -66.7636 Td -(2648 p->len = len;) 12.04 Tj -0 -68.0727 Td -(2649 p->next = 0;) 11.438 Tj -0 -72 Td -(Sheet 26) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/kalloc.c Page 3) 23.478 Tj -0 -3.92728 Td -(2650 *rr = p;) 9.03 Tj -0 -5.23637 Td -(2651 ) 3.01 Tj -0 -6.54546 Td -(2652 out:) 6.02 Tj -0 -7.85455 Td -(2653 release\(&kalloc_lock\);) 17.458 Tj -0 -9.16364 Td -(2654 }) 3.612 Tj -0 -10.4727 Td -(2655 ) 3.01 Tj -0 -11.7818 Td -(2656 // Allocate n bytes of physical memory.) 26.488 Tj -0 -13.0909 Td -(2657 // Returns a kernel-segment pointer.) 24.682 Tj -0 -14.4 Td -(2658 // Returns 0 if the memory cannot be allocated.) 31.304 Tj -0 -15.7091 Td -(2659 char*) 6.02 Tj -0 -17.0182 Td -(2660 kalloc\(int n\)) 10.836 Tj -0 -18.3273 Td -(2661 {) 3.612 Tj -0 -19.6364 Td -(2662 struct run **rr;) 13.846 Tj -0 -20.9455 Td -(2663 ) 3.01 Tj -0 -22.2545 Td -(2664 if\(n % PAGE\)) 11.438 Tj -0 -23.5636 Td -(2665 panic\("kalloc"\);) 15.05 Tj -0 -24.8727 Td -(2666 ) 3.01 Tj -0 -26.1818 Td -(2667 acquire\(&kalloc_lock\);) 17.458 Tj -0 -27.4909 Td -(2668 ) 3.01 Tj -0 -28.8 Td -(2669 rr = &freelist;) 13.244 Tj -0 -30.1091 Td -(2670 while\(*rr\){) 10.836 Tj -0 -31.4182 Td -(2671 struct run *r = *rr;) 17.458 Tj -0 -32.7273 Td -(2672 if\(r->len == n\){) 15.05 Tj -0 -34.0364 Td -(2673 *rr = r->next;) 15.05 Tj -0 -35.3454 Td -(2674 release\(&kalloc_lock\);) 19.866 Tj -0 -36.6545 Td -(2675 return \(char*\) r;) 16.856 Tj -0 -37.9636 Td -(2676 }) 6.02 Tj -0 -39.2727 Td -(2677 if\(r->len > n\){) 14.448 Tj -0 -40.5818 Td -(2678 char *p = \(char*\)r + \(r->len - n\);) 27.09 Tj -0 -41.8909 Td -(2679 r->len -= n;) 13.846 Tj -0 -43.2 Td -(2680 release\(&kalloc_lock\);) 19.866 Tj -0 -44.5091 Td -(2681 return p;) 12.04 Tj -0 -45.8182 Td -(2682 }) 6.02 Tj -0 -47.1272 Td -(2683 rr = &\(*rr\)->next;) 16.254 Tj -0 -48.4363 Td -(2684 }) 4.816 Tj -0 -49.7454 Td -(2685 release\(&kalloc_lock\);) 17.458 Tj -0 -51.0545 Td -(2686 cprintf\("kalloc: out of memory\\n"\);) 25.284 Tj -0 -52.3636 Td -(2687 return 0;) 9.632 Tj -0 -53.6727 Td -(2688 }) 3.612 Tj -0 -54.9818 Td -(2689 ) 3.01 Tj -0 -56.2909 Td -(2690 ) 3.01 Tj -0 -57.6 Td -(2691 ) 3.01 Tj -0 -58.9091 Td -(2692 ) 3.01 Tj -0 -60.2181 Td -(2693 ) 3.01 Tj -0 -61.5272 Td -(2694 ) 3.01 Tj -0 -62.8363 Td -(2695 ) 3.01 Tj -0 -64.1454 Td -(2696 ) 3.01 Tj -0 -65.4545 Td -(2697 ) 3.01 Tj -0 -66.7636 Td -(2698 ) 3.01 Tj -0 -68.0727 Td -(2699 ) 3.01 Tj -0 -72 Td -(Sheet 26) 4.816 Tj +/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 @@ -10286,7 +10965,10 @@ pdfEndPage %%Page: 34 34 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -10294,241 +10976,259 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/syscall.h Page 1) 24.08 Tj -0 -3.92728 Td -(2700 // System call numbers) 16.254 Tj -0 -5.23637 Td -(2701 #define SYS_fork 1) 15.652 Tj -0 -6.54546 Td -(2702 #define SYS_exit 2) 15.652 Tj -0 -7.85455 Td -(2703 #define SYS_wait 3) 15.652 Tj -0 -9.16364 Td -(2704 #define SYS_pipe 4) 15.652 Tj -0 -10.4727 Td -(2705 #define SYS_write 5) 15.652 Tj -0 -11.7818 Td -(2706 #define SYS_read 6) 15.652 Tj -0 -13.0909 Td -(2707 #define SYS_close 7) 15.652 Tj -0 -14.4 Td -(2708 #define SYS_kill 8) 15.652 Tj -0 -15.7091 Td -(2709 #define SYS_exec 9) 15.652 Tj -0 -17.0182 Td -(2710 #define SYS_open 10) 15.652 Tj -0 -18.3273 Td -(2711 #define SYS_mknod 11) 15.652 Tj -0 -19.6364 Td -(2712 #define SYS_unlink 12) 15.652 Tj -0 -20.9455 Td -(2713 #define SYS_fstat 13) 15.652 Tj -0 -22.2545 Td -(2714 #define SYS_link 14) 15.652 Tj -0 -23.5636 Td -(2715 #define SYS_mkdir 15) 15.652 Tj -0 -24.8727 Td -(2716 #define SYS_chdir 16) 15.652 Tj -0 -26.1818 Td -(2717 #define SYS_dup 17) 15.652 Tj -0 -27.4909 Td -(2718 #define SYS_getpid 18) 15.652 Tj -0 -28.8 Td -(2719 #define SYS_sbrk 19) 15.652 Tj -0 -30.1091 Td -(2720 ) 3.01 Tj -0 -31.4182 Td -(2721 ) 3.01 Tj -0 -32.7273 Td -(2722 ) 3.01 Tj -0 -34.0364 Td -(2723 ) 3.01 Tj -0 -35.3454 Td -(2724 ) 3.01 Tj -0 -36.6545 Td -(2725 ) 3.01 Tj -0 -37.9636 Td -(2726 ) 3.01 Tj -0 -39.2727 Td -(2727 ) 3.01 Tj -0 -40.5818 Td -(2728 ) 3.01 Tj -0 -41.8909 Td -(2729 ) 3.01 Tj -0 -43.2 Td -(2730 ) 3.01 Tj -0 -44.5091 Td -(2731 ) 3.01 Tj -0 -45.8182 Td -(2732 ) 3.01 Tj -0 -47.1272 Td -(2733 ) 3.01 Tj -0 -48.4363 Td -(2734 ) 3.01 Tj -0 -49.7454 Td -(2735 ) 3.01 Tj -0 -51.0545 Td -(2736 ) 3.01 Tj -0 -52.3636 Td -(2737 ) 3.01 Tj -0 -53.6727 Td -(2738 ) 3.01 Tj -0 -54.9818 Td -(2739 ) 3.01 Tj -0 -56.2909 Td -(2740 ) 3.01 Tj -0 -57.6 Td -(2741 ) 3.01 Tj -0 -58.9091 Td -(2742 ) 3.01 Tj -0 -60.2181 Td -(2743 ) 3.01 Tj -0 -61.5272 Td -(2744 ) 3.01 Tj -0 -62.8363 Td -(2745 ) 3.01 Tj -0 -64.1454 Td -(2746 ) 3.01 Tj -0 -65.4545 Td -(2747 ) 3.01 Tj -0 -66.7636 Td -(2748 ) 3.01 Tj -0 -68.0727 Td -(2749 ) 3.01 Tj -0 -72 Td -(Sheet 27) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/trapasm.S Page 1) 24.08 Tj -0 -3.92728 Td -(2750 .text) 6.02 Tj -0 -5.23637 Td -(2751 .globl trap) 9.632 Tj -0 -6.54546 Td -(2752 .globl trapret1) 12.04 Tj -0 -7.85455 Td -(2753 ) 3.01 Tj -0 -9.16364 Td -(2754 .globl alltraps) 12.04 Tj -0 -10.4727 Td -(2755 alltraps:) 8.428 Tj -0 -11.7818 Td -(2756 /* vectors.S sends all traps here */) 25.886 Tj -0 -13.0909 Td -(2757 pushl %ds # build) 18.662 Tj -0 -14.4 Td -(2758 pushl %es # trap) 18.662 Tj -0 -15.7091 Td -(2759 pushal # frame) 19.264 Tj -0 -17.0182 Td -(2760 movl $16,%eax # SEG_KDATA << 3) 24.08 Tj -0 -18.3273 Td -(2761 movw %ax,%ds # kernel) 19.866 Tj -0 -19.6364 Td -(2762 movw %ax,%es # segments) 21.07 Tj -0 -20.9455 Td -(2763 pushl %esp # pass pointer to this trapframe) 33.712 Tj -0 -22.2545 Td -(2764 call trap # and call trap\(\)) 25.284 Tj -0 -23.5636 Td -(2765 addl $4, %esp) 12.04 Tj -0 -24.8727 Td -(2766 # return falls through to trapret...) 25.886 Tj -0 -26.1818 Td -(2767 ) 3.01 Tj -0 -27.4909 Td -(2768 /*) 5.418 Tj -0 -28.8 Td -(2769 * a forked process RETs here) 21.672 Tj -0 -30.1091 Td -(2770 * expects ESP to point to a Trapframe) 27.09 Tj -0 -31.4182 Td -(2771 */) 6.02 Tj -0 -32.7273 Td -(2772 .globl trapret) 11.438 Tj -0 -34.0364 Td -(2773 trapret:) 7.826 Tj -0 -35.3454 Td -(2774 popal) 7.224 Tj -0 -36.6545 Td -(2775 popl %es) 9.03 Tj -0 -37.9636 Td -(2776 popl %ds) 9.03 Tj -0 -39.2727 Td -(2777 addl $0x8, %esp /* trapno and errcode */) 28.294 Tj -0 -40.5818 Td -(2778 iret) 6.622 Tj -0 -41.8909 Td -(2779 ) 3.01 Tj -0 -43.2 Td -(2780 .globl forkret1) 12.04 Tj -0 -44.5091 Td -(2781 forkret1:) 8.428 Tj -0 -45.8182 Td -(2782 movl 4\(%esp\), %esp) 15.05 Tj -0 -47.1272 Td -(2783 jmp trapret) 10.836 Tj -0 -48.4363 Td -(2784 ) 3.01 Tj -0 -49.7454 Td -(2785 .globl acpu) 10.234 Tj -0 -51.0545 Td -(2786 acpu:) 6.02 Tj -0 -52.3636 Td -(2787 .long 0) 8.428 Tj -0 -53.6727 Td -(2788 ) 3.01 Tj -0 -54.9818 Td -(2789 ) 3.01 Tj -0 -56.2909 Td -(2790 ) 3.01 Tj -0 -57.6 Td -(2791 ) 3.01 Tj -0 -58.9091 Td -(2792 ) 3.01 Tj -0 -60.2181 Td -(2793 ) 3.01 Tj -0 -61.5272 Td -(2794 ) 3.01 Tj -0 -62.8363 Td -(2795 ) 3.01 Tj -0 -64.1454 Td -(2796 ) 3.01 Tj -0 -65.4545 Td -(2797 ) 3.01 Tj -0 -66.7636 Td -(2798 ) 3.01 Tj -0 -68.0727 Td -(2799 ) 3.01 Tj -0 -72 Td -(Sheet 27) 4.816 Tj +/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 @@ -10540,6 +11240,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -10547,241 +11250,253 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/traps.h Page 1) 22.876 Tj -0 -3.92728 Td -(2800 // x86 trap and interrupt constants.) 24.682 Tj -0 -5.23637 Td -(2801 ) 3.01 Tj -0 -6.54546 Td -(2802 // Processor-defined:) 15.652 Tj -0 -7.85455 Td -(2803 #define T_DIVIDE 0 // divide error) 31.304 Tj -0 -9.16364 Td -(2804 #define T_DEBUG 1 // debug exception) 33.11 Tj -0 -10.4727 Td -(2805 #define T_NMI 2 // non-maskable interrupt) 37.324 Tj -0 -11.7818 Td -(2806 #define T_BRKPT 3 // breakpoint) 30.1 Tj -0 -13.0909 Td -(2807 #define T_OFLOW 4 // overflow) 28.896 Tj -0 -14.4 Td -(2808 #define T_BOUND 5 // bounds check) 31.304 Tj -0 -15.7091 Td -(2809 #define T_ILLOP 6 // illegal opcode) 32.508 Tj -0 -17.0182 Td -(2810 #define T_DEVICE 7 // device not available) 36.12 Tj -0 -18.3273 Td -(2811 #define T_DBLFLT 8 // double fault) 31.304 Tj -0 -19.6364 Td -(2812 // #define T_COPROC 9 // reserved \(not used since 486\)) 41.538 Tj -0 -20.9455 Td -(2813 #define T_TSS 10 // invalid task switch segment) 40.334 Tj -0 -22.2545 Td -(2814 #define T_SEGNP 11 // segment not present) 35.518 Tj -0 -23.5636 Td -(2815 #define T_STACK 12 // stack exception) 33.11 Tj -0 -24.8727 Td -(2816 #define T_GPFLT 13 // genernal protection fault) 39.13 Tj -0 -26.1818 Td -(2817 #define T_PGFLT 14 // page fault) 30.1 Tj -0 -27.4909 Td -(2818 // #define T_RES 15 // reserved) 28.896 Tj -0 -28.8 Td -(2819 #define T_FPERR 16 // floating point error) 36.12 Tj -0 -30.1091 Td -(2820 #define T_ALIGN 17 // aligment check) 32.508 Tj -0 -31.4182 Td -(2821 #define T_MCHK 18 // machine check) 31.906 Tj -0 -32.7273 Td -(2822 #define T_SIMDERR 19 // SIMD floating point error) 39.13 Tj -0 -34.0364 Td -(2823 ) 3.01 Tj -0 -35.3454 Td -(2824 // These are arbitrarily chosen, but with care not to overlap) 39.732 Tj -0 -36.6545 Td -(2825 // processor defined exceptions or interrupt vectors.) 34.916 Tj -0 -37.9636 Td -(2826 #define T_SYSCALL 48 // system call) 30.702 Tj -0 -39.2727 Td -(2827 #define T_DEFAULT 500 // catchall) 28.896 Tj -0 -40.5818 Td -(2828 ) 3.01 Tj -0 -41.8909 Td -(2829 #define IRQ_OFFSET 32 // IRQ 0 corresponds to int IRQ_OFFSET) 45.15 Tj -0 -43.2 Td -(2830 ) 3.01 Tj -0 -44.5091 Td -(2831 #define IRQ_TIMER 0) 18.662 Tj -0 -45.8182 Td -(2832 #define IRQ_KBD 1) 18.662 Tj -0 -47.1272 Td -(2833 #define IRQ_IDE 14) 18.662 Tj -0 -48.4363 Td -(2834 #define IRQ_ERROR 19) 18.662 Tj -0 -49.7454 Td -(2835 #define IRQ_SPURIOUS 31) 18.662 Tj -0 -51.0545 Td -(2836 ) 3.01 Tj -0 -52.3636 Td -(2837 ) 3.01 Tj -0 -53.6727 Td -(2838 ) 3.01 Tj -0 -54.9818 Td -(2839 ) 3.01 Tj -0 -56.2909 Td -(2840 ) 3.01 Tj -0 -57.6 Td -(2841 ) 3.01 Tj -0 -58.9091 Td -(2842 ) 3.01 Tj -0 -60.2181 Td -(2843 ) 3.01 Tj -0 -61.5272 Td -(2844 ) 3.01 Tj -0 -62.8363 Td -(2845 ) 3.01 Tj -0 -64.1454 Td -(2846 ) 3.01 Tj -0 -65.4545 Td -(2847 ) 3.01 Tj -0 -66.7636 Td -(2848 ) 3.01 Tj -0 -68.0727 Td -(2849 ) 3.01 Tj -0 -72 Td -(Sheet 28) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/trap.c Page 1) 22.274 Tj -0 -3.92728 Td -(2850 #include "types.h") 13.846 Tj -0 -5.23637 Td -(2851 #include "param.h") 13.846 Tj -0 -6.54546 Td -(2852 #include "mmu.h") 12.642 Tj -0 -7.85455 Td -(2853 #include "proc.h") 13.244 Tj -0 -9.16364 Td -(2854 #include "defs.h") 13.244 Tj -0 -10.4727 Td -(2855 #include "x86.h") 12.642 Tj -0 -11.7818 Td -(2856 #include "traps.h") 13.846 Tj -0 -13.0909 Td -(2857 #include "syscall.h") 15.05 Tj -0 -14.4 Td -(2858 ) 3.01 Tj -0 -15.7091 Td -(2859 // Interrupt descriptor table \(shared by all CPUs\).) 33.712 Tj -0 -17.0182 Td -(2860 struct gatedesc idt[256];) 18.06 Tj -0 -18.3273 Td -(2861 extern uint vectors[]; // in vectors.S: array of 256 entry pointers) 43.946 Tj -0 -19.6364 Td -(2862 ) 3.01 Tj -0 -20.9455 Td -(2863 void) 5.418 Tj -0 -22.2545 Td -(2864 tvinit\(void\)) 10.234 Tj -0 -23.5636 Td -(2865 {) 3.612 Tj -0 -24.8727 Td -(2866 int i;) 7.826 Tj -0 -26.1818 Td -(2867 ) 3.01 Tj -0 -27.4909 Td -(2868 for\(i = 0; i < 256; i++\)) 18.662 Tj -0 -28.8 Td -(2869 SETGATE\(idt[i], 0, SEG_KCODE << 3, vectors[i], 0\);) 35.518 Tj -0 -30.1091 Td -(2870 SETGATE\(idt[T_SYSCALL], 0, SEG_KCODE << 3, vectors[T_SYSCALL], 3\);) 43.946 Tj -0 -31.4182 Td -(2871 }) 3.612 Tj -0 -32.7273 Td -(2872 ) 3.01 Tj -0 -34.0364 Td -(2873 void) 5.418 Tj -0 -35.3454 Td -(2874 idtinit\(void\)) 10.836 Tj -0 -36.6545 Td -(2875 {) 3.612 Tj -0 -37.9636 Td -(2876 lidt\(idt, sizeof idt\);) 17.458 Tj -0 -39.2727 Td -(2877 }) 3.612 Tj -0 -40.5818 Td -(2878 ) 3.01 Tj -0 -41.8909 Td -(2879 void) 5.418 Tj -0 -43.2 Td -(2880 trap\(struct trapframe *tf\)) 18.662 Tj -0 -44.5091 Td -(2881 {) 3.612 Tj -0 -45.8182 Td -(2882 int v = tf->trapno;) 15.652 Tj -0 -47.1272 Td -(2883 struct proc *cp = curproc[cpu\(\)];) 24.08 Tj -0 -48.4363 Td -(2884 ) 3.01 Tj -0 -49.7454 Td -(2885 if\(v == T_SYSCALL\){) 15.652 Tj -0 -51.0545 Td -(2886 if\(cp->killed\)) 13.846 Tj -0 -52.3636 Td -(2887 proc_exit\(\);) 13.846 Tj -0 -53.6727 Td -(2888 cp->tf = tf;) 12.642 Tj -0 -54.9818 Td -(2889 syscall\(\);) 11.438 Tj -0 -56.2909 Td -(2890 if\(cp->killed\)) 13.846 Tj -0 -57.6 Td -(2891 proc_exit\(\);) 13.846 Tj -0 -58.9091 Td -(2892 return;) 9.632 Tj -0 -60.2181 Td -(2893 }) 4.816 Tj -0 -61.5272 Td -(2894 ) 3.01 Tj -0 -62.8363 Td -(2895 ) 3.01 Tj -0 -64.1454 Td -(2896 ) 3.01 Tj -0 -65.4545 Td -(2897 ) 3.01 Tj -0 -66.7636 Td -(2898 ) 3.01 Tj -0 -68.0727 Td -(2899 ) 3.01 Tj -0 -72 Td -(Sheet 28) 4.816 Tj +/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 @@ -10792,7 +11507,10 @@ pdfEndPage %%Page: 36 36 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -10800,241 +11518,253 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/trap.c Page 2) 22.274 Tj -0 -3.92728 Td -(2900 // Increment nlock to make sure interrupts stay off) 34.916 Tj -0 -5.23637 Td -(2901 // during interrupt handler. Decrement before returning.) 38.528 Tj -0 -6.54546 Td -(2902 cpus[cpu\(\)].nlock++;) 16.254 Tj -0 -7.85455 Td -(2903 ) 3.01 Tj -0 -9.16364 Td -(2904 switch\(v\){) 10.234 Tj -0 -10.4727 Td -(2905 case IRQ_OFFSET + IRQ_TIMER:) 21.07 Tj -0 -11.7818 Td -(2906 lapic_timerintr\(\);) 16.254 Tj -0 -13.0909 Td -(2907 cpus[cpu\(\)].nlock--;) 17.458 Tj -0 -14.4 Td -(2908 if\(cp\){) 9.632 Tj -0 -15.7091 Td -(2909 // Force process exit if it has been killed and is in user space.) 45.752 Tj -0 -17.0182 Td -(2910 // \(If it is still executing in the kernel, let it keep running) 44.548 Tj -0 -18.3273 Td -(2911 // until it gets to the regular system call return.\)) 37.926 Tj -0 -19.6364 Td -(2912 if\(\(tf->cs&3\) == 3 && cp->killed\)) 26.488 Tj -0 -20.9455 Td -(2913 proc_exit\(\);) 15.05 Tj -0 -22.2545 Td -(2914 ) 3.01 Tj -0 -23.5636 Td -(2915 // Force process to give up CPU and let others run.) 37.324 Tj -0 -24.8727 Td -(2916 if\(cp->state == RUNNING\)) 21.07 Tj -0 -26.1818 Td -(2917 yield\(\);) 12.642 Tj -0 -27.4909 Td -(2918 }) 6.02 Tj -0 -28.8 Td -(2919 return;) 9.632 Tj -0 -30.1091 Td -(2920 ) 3.01 Tj -0 -31.4182 Td -(2921 case IRQ_OFFSET + IRQ_IDE:) 19.866 Tj -0 -32.7273 Td -(2922 ide_intr\(\);) 12.04 Tj -0 -34.0364 Td -(2923 lapic_eoi\(\);) 12.642 Tj -0 -35.3454 Td -(2924 break;) 9.03 Tj -0 -36.6545 Td -(2925 ) 3.01 Tj -0 -37.9636 Td -(2926 case IRQ_OFFSET + IRQ_KBD:) 19.866 Tj -0 -39.2727 Td -(2927 kbd_intr\(\);) 12.04 Tj -0 -40.5818 Td -(2928 lapic_eoi\(\);) 12.642 Tj -0 -41.8909 Td -(2929 break;) 9.03 Tj -0 -43.2 Td -(2930 ) 3.01 Tj -0 -44.5091 Td -(2931 case IRQ_OFFSET + IRQ_SPURIOUS:) 22.876 Tj -0 -45.8182 Td -(2932 cprintf\("spurious interrupt from cpu %d eip %x\\n", cpu\(\), tf->eip\);) 45.752 Tj -0 -47.1272 Td -(2933 break;) 9.03 Tj -0 -48.4363 Td -(2934 ) 3.01 Tj -0 -49.7454 Td -(2935 default:) 9.03 Tj -0 -51.0545 Td -(2936 if\(curproc[cpu\(\)]\) {) 17.458 Tj -0 -52.3636 Td -(2937 // Assume process divided by zero or dereferenced null, etc.) 42.742 Tj -0 -53.6727 Td -(2938 cprintf\("pid %d: unhandled trap %d on cpu %d eip %x -- kill proc\\n",) 47.558 Tj -0 -54.9818 Td -(2939 curproc[cpu\(\)]->pid, v, cpu\(\), tf->eip\);) 35.518 Tj -0 -56.2909 Td -(2940 proc_exit\(\);) 13.846 Tj -0 -57.6 Td -(2941 }) 6.02 Tj -0 -58.9091 Td -(2942 ) 3.01 Tj -0 -60.2181 Td -(2943 // Otherwise it's our mistake.) 23.478 Tj -0 -61.5272 Td -(2944 cprintf\("unexpected trap %d from cpu %d eip %x\\n", v, cpu\(\), tf->eip\);) 47.558 Tj -0 -62.8363 Td -(2945 panic\("trap"\);) 13.846 Tj -0 -64.1454 Td -(2946 }) 4.816 Tj -0 -65.4545 Td -(2947 ) 3.01 Tj -0 -66.7636 Td -(2948 cpus[cpu\(\)].nlock--;) 16.254 Tj -0 -68.0727 Td -(2949 }) 3.612 Tj -0 -72 Td -(Sheet 29) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/vectors.pl Page 1) 24.682 Tj -0 -3.92728 Td -(2950 #!/usr/bin/perl -w) 13.846 Tj -0 -5.23637 Td -(2951 ) 3.01 Tj -0 -6.54546 Td -(2952 # Generate vectors.S, the trap/interrupt entry points.) 35.518 Tj -0 -7.85455 Td -(2953 # There has to be one entry point per interrupt number) 35.518 Tj -0 -9.16364 Td -(2954 # since otherwise there's no way for trap\(\) to discover) 36.12 Tj -0 -10.4727 Td -(2955 # the interrupt number.) 16.856 Tj -0 -11.7818 Td -(2956 ) 3.01 Tj -0 -13.0909 Td -(2957 print "# generated by vectors.pl - do not edit\\n";) 33.11 Tj -0 -14.4 Td -(2958 print "# handlers\\n";) 15.652 Tj -0 -15.7091 Td -(2959 print ".text\\n";) 12.642 Tj -0 -17.0182 Td -(2960 print ".globl alltraps\\n";) 18.662 Tj -0 -18.3273 Td -(2961 for\(my $i = 0; $i < 256; $i++\){) 21.672 Tj -0 -19.6364 Td -(2962 print ".globl vector$i\\n";) 21.07 Tj -0 -20.9455 Td -(2963 print "vector$i:\\n";) 17.458 Tj -0 -22.2545 Td -(2964 if\(\($i < 8 || $i > 14\) && $i != 17\){) 27.09 Tj -0 -23.5636 Td -(2965 print " pushl \\$0\\n";) 21.07 Tj -0 -24.8727 Td -(2966 }) 6.02 Tj -0 -26.1818 Td -(2967 print " pushl \\$$i\\n";) 19.264 Tj -0 -27.4909 Td -(2968 print " jmp alltraps\\n";) 20.468 Tj -0 -28.8 Td -(2969 }) 3.612 Tj -0 -30.1091 Td -(2970 ) 3.01 Tj -0 -31.4182 Td -(2971 print "\\n# vector table\\n";) 19.264 Tj -0 -32.7273 Td -(2972 print ".data\\n";) 12.642 Tj -0 -34.0364 Td -(2973 print ".globl vectors\\n";) 18.06 Tj -0 -35.3454 Td -(2974 print "vectors:\\n";) 14.448 Tj -0 -36.6545 Td -(2975 for\(my $i = 0; $i < 256; $i++\){) 21.672 Tj -0 -37.9636 Td -(2976 print " .long vector$i\\n";) 21.672 Tj -0 -39.2727 Td -(2977 }) 3.612 Tj -0 -40.5818 Td -(2978 ) 3.01 Tj -0 -41.8909 Td -(2979 ) 3.01 Tj -0 -43.2 Td -(2980 ) 3.01 Tj -0 -44.5091 Td -(2981 ) 3.01 Tj -0 -45.8182 Td -(2982 ) 3.01 Tj -0 -47.1272 Td -(2983 ) 3.01 Tj -0 -48.4363 Td -(2984 ) 3.01 Tj -0 -49.7454 Td -(2985 ) 3.01 Tj -0 -51.0545 Td -(2986 ) 3.01 Tj -0 -52.3636 Td -(2987 ) 3.01 Tj -0 -53.6727 Td -(2988 ) 3.01 Tj -0 -54.9818 Td -(2989 ) 3.01 Tj -0 -56.2909 Td -(2990 ) 3.01 Tj -0 -57.6 Td -(2991 ) 3.01 Tj -0 -58.9091 Td -(2992 ) 3.01 Tj -0 -60.2181 Td -(2993 ) 3.01 Tj -0 -61.5272 Td -(2994 ) 3.01 Tj -0 -62.8363 Td -(2995 ) 3.01 Tj -0 -64.1454 Td -(2996 ) 3.01 Tj -0 -65.4545 Td -(2997 ) 3.01 Tj -0 -66.7636 Td -(2998 ) 3.01 Tj -0 -68.0727 Td -(2999 ) 3.01 Tj -0 -72 Td -(Sheet 29) 4.816 Tj +/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 @@ -11046,6 +11776,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -11053,241 +11786,253 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/syscall.c Page 1) 24.08 Tj -0 -3.92728 Td -(3000 #include "types.h") 13.846 Tj -0 -5.23637 Td -(3001 #include "stat.h") 13.244 Tj -0 -6.54546 Td -(3002 #include "param.h") 13.846 Tj -0 -7.85455 Td -(3003 #include "mmu.h") 12.642 Tj -0 -9.16364 Td -(3004 #include "proc.h") 13.244 Tj -0 -10.4727 Td -(3005 #include "defs.h") 13.244 Tj -0 -11.7818 Td -(3006 #include "x86.h") 12.642 Tj -0 -13.0909 Td -(3007 #include "traps.h") 13.846 Tj -0 -14.4 Td -(3008 #include "syscall.h") 15.05 Tj -0 -15.7091 Td -(3009 #include "spinlock.h") 15.652 Tj -0 -17.0182 Td -(3010 #include "buf.h") 12.642 Tj -0 -18.3273 Td -(3011 #include "fs.h") 12.04 Tj -0 -19.6364 Td -(3012 #include "fsvar.h") 13.846 Tj -0 -20.9455 Td -(3013 #include "elf.h") 12.642 Tj -0 -22.2545 Td -(3014 #include "file.h") 13.244 Tj -0 -23.5636 Td -(3015 #include "fcntl.h") 13.846 Tj -0 -24.8727 Td -(3016 ) 3.01 Tj -0 -26.1818 Td -(3017 // User code makes a system call with INT T_SYSCALL.) 34.314 Tj -0 -27.4909 Td -(3018 // System call number in %eax.) 21.07 Tj -0 -28.8 Td -(3019 // Arguments on the stack, from the user call to the C) 35.518 Tj -0 -30.1091 Td -(3020 // library system call function. The saved user %esp points) 38.528 Tj -0 -31.4182 Td -(3021 // to a saved program counter, and then the first argument.) 38.528 Tj -0 -32.7273 Td -(3022 ) 3.01 Tj -0 -34.0364 Td -(3023 // Fetch the int at addr from process p.) 27.09 Tj -0 -35.3454 Td -(3024 int) 4.816 Tj -0 -36.6545 Td -(3025 fetchint\(struct proc *p, uint addr, int *ip\)) 29.498 Tj -0 -37.9636 Td -(3026 {) 3.612 Tj -0 -39.2727 Td -(3027 if\(addr >= p->sz || addr+4 > p->sz\)) 25.284 Tj -0 -40.5818 Td -(3028 return -1;) 11.438 Tj -0 -41.8909 Td -(3029 *ip = *\(int*\)\(p->mem + addr\);) 21.672 Tj -0 -43.2 Td -(3030 return 0;) 9.632 Tj -0 -44.5091 Td -(3031 }) 3.612 Tj -0 -45.8182 Td -(3032 ) 3.01 Tj -0 -47.1272 Td -(3033 // Fetch the nul-terminated string at addr from process p.) 37.926 Tj -0 -48.4363 Td -(3034 // Doesn't actually copy the string - just sets *pp to point at it.) 43.344 Tj -0 -49.7454 Td -(3035 // Returns length of string, not including nul.) 31.304 Tj -0 -51.0545 Td -(3036 int) 4.816 Tj -0 -52.3636 Td -(3037 fetchstr\(struct proc *p, uint addr, char **pp\)) 30.702 Tj -0 -53.6727 Td -(3038 {) 3.612 Tj -0 -54.9818 Td -(3039 char *cp, *ep;) 12.642 Tj -0 -56.2909 Td -(3040 ) 3.01 Tj -0 -57.6 Td -(3041 if\(addr >= p->sz\)) 14.448 Tj -0 -58.9091 Td -(3042 return -1;) 11.438 Tj -0 -60.2181 Td -(3043 *pp = p->mem + addr;) 16.254 Tj -0 -61.5272 Td -(3044 ep = p->mem + p->sz;) 16.254 Tj -0 -62.8363 Td -(3045 for\(cp = *pp; cp < ep; cp++\)) 21.07 Tj -0 -64.1454 Td -(3046 if\(*cp == 0\)) 12.642 Tj -0 -65.4545 Td -(3047 return cp - *pp;) 16.254 Tj -0 -66.7636 Td -(3048 return -1;) 10.234 Tj -0 -68.0727 Td -(3049 }) 3.612 Tj -0 -72 Td -(Sheet 30) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/syscall.c Page 2) 24.08 Tj -0 -3.92728 Td -(3050 // Fetch the argno'th word-sized system call argument as an integer.) 43.946 Tj -0 -5.23637 Td -(3051 int) 4.816 Tj -0 -6.54546 Td -(3052 argint\(int argno, int *ip\)) 18.662 Tj -0 -7.85455 Td -(3053 {) 3.612 Tj -0 -9.16364 Td -(3054 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -10.4727 Td -(3055 ) 3.01 Tj -0 -11.7818 Td -(3056 return fetchint\(p, p->tf->esp + 4 + 4*argno, ip\);) 33.712 Tj -0 -13.0909 Td -(3057 }) 3.612 Tj -0 -14.4 Td -(3058 ) 3.01 Tj -0 -15.7091 Td -(3059 // Fetch the nth word-sized system call argument as a pointer) 39.732 Tj -0 -17.0182 Td -(3060 // to a block of memory of size n bytes. Check that the pointer) 41.538 Tj -0 -18.3273 Td -(3061 // lies within the process address space.) 27.692 Tj -0 -19.6364 Td -(3062 int) 4.816 Tj -0 -20.9455 Td -(3063 argptr\(int argno, char **pp, int size\)) 25.886 Tj -0 -22.2545 Td -(3064 {) 3.612 Tj -0 -23.5636 Td -(3065 int i;) 7.826 Tj -0 -24.8727 Td -(3066 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -26.1818 Td -(3067 ) 3.01 Tj -0 -27.4909 Td -(3068 if\(argint\(argno, &i\) < 0\)) 19.264 Tj -0 -28.8 Td -(3069 return -1;) 11.438 Tj -0 -30.1091 Td -(3070 if\(\(uint\)i >= p->sz || \(uint\)i+size >= p->sz\)) 31.304 Tj -0 -31.4182 Td -(3071 return -1;) 11.438 Tj -0 -32.7273 Td -(3072 *pp = p->mem + i;) 14.448 Tj -0 -34.0364 Td -(3073 return 0;) 9.632 Tj -0 -35.3454 Td -(3074 }) 3.612 Tj -0 -36.6545 Td -(3075 ) 3.01 Tj -0 -37.9636 Td -(3076 // Fetch the nth word-sized system call argument as a string pointer.) 44.548 Tj -0 -39.2727 Td -(3077 // Check that the pointer is valid and the string is nul-terminated.) 43.946 Tj -0 -40.5818 Td -(3078 // \(There is no shared writable memory, so the string can't change) 42.742 Tj -0 -41.8909 Td -(3079 // between this check and being used by the kernel.\)) 34.314 Tj -0 -43.2 Td -(3080 int) 4.816 Tj -0 -44.5091 Td -(3081 argstr\(int argno, char **pp\)) 19.866 Tj -0 -45.8182 Td -(3082 {) 3.612 Tj -0 -47.1272 Td -(3083 int addr;) 9.632 Tj -0 -48.4363 Td -(3084 if\(argint\(argno, &addr\) < 0\)) 21.07 Tj -0 -49.7454 Td -(3085 return -1;) 11.438 Tj -0 -51.0545 Td -(3086 return fetchstr\(curproc[cpu\(\)], addr, pp\);) 29.498 Tj -0 -52.3636 Td -(3087 }) 3.612 Tj -0 -53.6727 Td -(3088 ) 3.01 Tj -0 -54.9818 Td -(3089 ) 3.01 Tj -0 -56.2909 Td -(3090 ) 3.01 Tj -0 -57.6 Td -(3091 ) 3.01 Tj -0 -58.9091 Td -(3092 ) 3.01 Tj -0 -60.2181 Td -(3093 ) 3.01 Tj -0 -61.5272 Td -(3094 ) 3.01 Tj -0 -62.8363 Td -(3095 ) 3.01 Tj -0 -64.1454 Td -(3096 ) 3.01 Tj -0 -65.4545 Td -(3097 ) 3.01 Tj -0 -66.7636 Td -(3098 ) 3.01 Tj -0 -68.0727 Td -(3099 ) 3.01 Tj -0 -72 Td -(Sheet 30) 4.816 Tj +/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 @@ -11298,7 +12043,10 @@ pdfEndPage %%Page: 38 38 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -11306,241 +12054,258 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/syscall.c Page 3) 24.08 Tj -0 -3.92728 Td -(3100 extern int sys_chdir\(void\);) 19.264 Tj -0 -5.23637 Td -(3101 extern int sys_close\(void\);) 19.264 Tj -0 -6.54546 Td -(3102 extern int sys_dup\(void\);) 18.06 Tj -0 -7.85455 Td -(3103 extern int sys_exec\(void\);) 18.662 Tj -0 -9.16364 Td -(3104 extern int sys_exit\(void\);) 18.662 Tj -0 -10.4727 Td -(3105 extern int sys_fork\(void\);) 18.662 Tj -0 -11.7818 Td -(3106 extern int sys_fstat\(void\);) 19.264 Tj -0 -13.0909 Td -(3107 extern int sys_getpid\(void\);) 19.866 Tj -0 -14.4 Td -(3108 extern int sys_kill\(void\);) 18.662 Tj -0 -15.7091 Td -(3109 extern int sys_link\(void\);) 18.662 Tj -0 -17.0182 Td -(3110 extern int sys_mkdir\(void\);) 19.264 Tj -0 -18.3273 Td -(3111 extern int sys_mknod\(void\);) 19.264 Tj -0 -19.6364 Td -(3112 extern int sys_open\(void\);) 18.662 Tj -0 -20.9455 Td -(3113 extern int sys_pipe\(void\);) 18.662 Tj -0 -22.2545 Td -(3114 extern int sys_read\(void\);) 18.662 Tj -0 -23.5636 Td -(3115 extern int sys_sbrk\(void\);) 18.662 Tj -0 -24.8727 Td -(3116 extern int sys_unlink\(void\);) 19.866 Tj -0 -26.1818 Td -(3117 extern int sys_wait\(void\);) 18.662 Tj -0 -27.4909 Td -(3118 extern int sys_write\(void\);) 19.264 Tj -0 -28.8 Td -(3119 ) 3.01 Tj -0 -30.1091 Td -(3120 void) 5.418 Tj -0 -31.4182 Td -(3121 syscall\(void\)) 10.836 Tj -0 -32.7273 Td -(3122 {) 3.612 Tj -0 -34.0364 Td -(3123 struct proc *cp = curproc[cpu\(\)];) 24.08 Tj -0 -35.3454 Td -(3124 int num = cp->tf->eax;) 17.458 Tj -0 -36.6545 Td -(3125 int ret = -1;) 12.04 Tj -0 -37.9636 Td -(3126 ) 3.01 Tj -0 -39.2727 Td -(3127 switch\(num\){) 11.438 Tj -0 -40.5818 Td -(3128 case SYS_fork:) 12.642 Tj -0 -41.8909 Td -(3129 ret = sys_fork\(\);) 15.652 Tj -0 -43.2 Td -(3130 break;) 9.03 Tj -0 -44.5091 Td -(3131 case SYS_exit:) 12.642 Tj -0 -45.8182 Td -(3132 ret = sys_exit\(\);) 15.652 Tj -0 -47.1272 Td -(3133 break;) 9.03 Tj -0 -48.4363 Td -(3134 case SYS_wait:) 12.642 Tj -0 -49.7454 Td -(3135 ret = sys_wait\(\);) 15.652 Tj -0 -51.0545 Td -(3136 break;) 9.03 Tj -0 -52.3636 Td -(3137 case SYS_pipe:) 12.642 Tj -0 -53.6727 Td -(3138 ret = sys_pipe\(\);) 15.652 Tj -0 -54.9818 Td -(3139 break;) 9.03 Tj -0 -56.2909 Td -(3140 case SYS_write:) 13.244 Tj -0 -57.6 Td -(3141 ret = sys_write\(\);) 16.254 Tj -0 -58.9091 Td -(3142 break;) 9.03 Tj -0 -60.2181 Td -(3143 case SYS_read:) 12.642 Tj -0 -61.5272 Td -(3144 ret = sys_read\(\);) 15.652 Tj -0 -62.8363 Td -(3145 break;) 9.03 Tj -0 -64.1454 Td -(3146 case SYS_close:) 13.244 Tj -0 -65.4545 Td -(3147 ret = sys_close\(\);) 16.254 Tj -0 -66.7636 Td -(3148 break;) 9.03 Tj -0 -68.0727 Td -(3149 case SYS_kill:) 12.642 Tj -0 -72 Td -(Sheet 31) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/syscall.c Page 4) 24.08 Tj -0 -3.92728 Td -(3150 ret = sys_kill\(\);) 15.652 Tj -0 -5.23637 Td -(3151 break;) 9.03 Tj -0 -6.54546 Td -(3152 case SYS_exec:) 12.642 Tj -0 -7.85455 Td -(3153 ret = sys_exec\(\);) 15.652 Tj -0 -9.16364 Td -(3154 break;) 9.03 Tj -0 -10.4727 Td -(3155 case SYS_open:) 12.642 Tj -0 -11.7818 Td -(3156 ret = sys_open\(\);) 15.652 Tj -0 -13.0909 Td -(3157 break;) 9.03 Tj -0 -14.4 Td -(3158 case SYS_mknod:) 13.244 Tj -0 -15.7091 Td -(3159 ret = sys_mknod\(\);) 16.254 Tj -0 -17.0182 Td -(3160 break;) 9.03 Tj -0 -18.3273 Td -(3161 case SYS_unlink:) 13.846 Tj -0 -19.6364 Td -(3162 ret = sys_unlink\(\);) 16.856 Tj -0 -20.9455 Td -(3163 break;) 9.03 Tj -0 -22.2545 Td -(3164 case SYS_fstat:) 13.244 Tj -0 -23.5636 Td -(3165 ret = sys_fstat\(\);) 16.254 Tj -0 -24.8727 Td -(3166 break;) 9.03 Tj -0 -26.1818 Td -(3167 case SYS_link:) 12.642 Tj -0 -27.4909 Td -(3168 ret = sys_link\(\);) 15.652 Tj -0 -28.8 Td -(3169 break;) 9.03 Tj -0 -30.1091 Td -(3170 case SYS_mkdir:) 13.244 Tj -0 -31.4182 Td -(3171 ret = sys_mkdir\(\);) 16.254 Tj -0 -32.7273 Td -(3172 break;) 9.03 Tj -0 -34.0364 Td -(3173 case SYS_chdir:) 13.244 Tj -0 -35.3454 Td -(3174 ret = sys_chdir\(\);) 16.254 Tj -0 -36.6545 Td -(3175 break;) 9.03 Tj -0 -37.9636 Td -(3176 case SYS_dup:) 12.04 Tj -0 -39.2727 Td -(3177 ret = sys_dup\(\);) 15.05 Tj -0 -40.5818 Td -(3178 break;) 9.03 Tj -0 -41.8909 Td -(3179 case SYS_getpid:) 13.846 Tj -0 -43.2 Td -(3180 ret = sys_getpid\(\);) 16.856 Tj -0 -44.5091 Td -(3181 break;) 9.03 Tj -0 -45.8182 Td -(3182 case SYS_sbrk:) 12.642 Tj -0 -47.1272 Td -(3183 ret = sys_sbrk\(\);) 15.652 Tj -0 -48.4363 Td -(3184 break;) 9.03 Tj -0 -49.7454 Td -(3185 default:) 9.03 Tj -0 -51.0545 Td -(3186 cprintf\("unknown sys call %d\\n", num\);) 28.294 Tj -0 -52.3636 Td -(3187 // Maybe kill the process?) 21.07 Tj -0 -53.6727 Td -(3188 break;) 9.03 Tj -0 -54.9818 Td -(3189 }) 4.816 Tj -0 -56.2909 Td -(3190 cp->tf->eax = ret;) 15.05 Tj -0 -57.6 Td -(3191 }) 3.612 Tj -0 -58.9091 Td -(3192 ) 3.01 Tj -0 -60.2181 Td -(3193 ) 3.01 Tj -0 -61.5272 Td -(3194 ) 3.01 Tj -0 -62.8363 Td -(3195 ) 3.01 Tj -0 -64.1454 Td -(3196 ) 3.01 Tj -0 -65.4545 Td -(3197 ) 3.01 Tj -0 -66.7636 Td -(3198 ) 3.01 Tj -0 -68.0727 Td -(3199 ) 3.01 Tj -0 -72 Td -(Sheet 31) 4.816 Tj +/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 @@ -11552,6 +12317,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -11559,241 +12327,254 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysproc.c Page 1) 24.08 Tj -0 -3.92728 Td -(3200 #include "types.h") 13.846 Tj -0 -5.23637 Td -(3201 #include "stat.h") 13.244 Tj -0 -6.54546 Td -(3202 #include "param.h") 13.846 Tj -0 -7.85455 Td -(3203 #include "mmu.h") 12.642 Tj -0 -9.16364 Td -(3204 #include "proc.h") 13.244 Tj -0 -10.4727 Td -(3205 #include "defs.h") 13.244 Tj -0 -11.7818 Td -(3206 #include "x86.h") 12.642 Tj -0 -13.0909 Td -(3207 #include "traps.h") 13.846 Tj -0 -14.4 Td -(3208 #include "syscall.h") 15.05 Tj -0 -15.7091 Td -(3209 #include "spinlock.h") 15.652 Tj -0 -17.0182 Td -(3210 #include "buf.h") 12.642 Tj -0 -18.3273 Td -(3211 #include "fs.h") 12.04 Tj -0 -19.6364 Td -(3212 #include "fsvar.h") 13.846 Tj -0 -20.9455 Td -(3213 #include "elf.h") 12.642 Tj -0 -22.2545 Td -(3214 #include "file.h") 13.244 Tj -0 -23.5636 Td -(3215 #include "fcntl.h") 13.846 Tj -0 -24.8727 Td -(3216 ) 3.01 Tj -0 -26.1818 Td -(3217 int) 4.816 Tj -0 -27.4909 Td -(3218 sys_fork\(void\)) 11.438 Tj -0 -28.8 Td -(3219 {) 3.612 Tj -0 -30.1091 Td -(3220 struct proc *np;) 13.846 Tj -0 -31.4182 Td -(3221 ) 3.01 Tj -0 -32.7273 Td -(3222 if\(\(np = copyproc\(curproc[cpu\(\)]\)\) == 0\)) 28.294 Tj -0 -34.0364 Td -(3223 return -1;) 11.438 Tj -0 -35.3454 Td -(3224 np->state = RUNNABLE;) 16.856 Tj -0 -36.6545 Td -(3225 return np->pid;) 13.244 Tj -0 -37.9636 Td -(3226 }) 3.612 Tj -0 -39.2727 Td -(3227 ) 3.01 Tj -0 -40.5818 Td -(3228 int) 4.816 Tj -0 -41.8909 Td -(3229 sys_exit\(void\)) 11.438 Tj -0 -43.2 Td -(3230 {) 3.612 Tj -0 -44.5091 Td -(3231 proc_exit\(\);) 11.438 Tj -0 -45.8182 Td -(3232 return 0; // not reached) 19.264 Tj -0 -47.1272 Td -(3233 }) 3.612 Tj -0 -48.4363 Td -(3234 ) 3.01 Tj -0 -49.7454 Td -(3235 int) 4.816 Tj -0 -51.0545 Td -(3236 sys_wait\(void\)) 11.438 Tj -0 -52.3636 Td -(3237 {) 3.612 Tj -0 -53.6727 Td -(3238 return proc_wait\(\);) 15.652 Tj -0 -54.9818 Td -(3239 }) 3.612 Tj -0 -56.2909 Td -(3240 ) 3.01 Tj -0 -57.6 Td -(3241 int) 4.816 Tj -0 -58.9091 Td -(3242 sys_kill\(void\)) 11.438 Tj -0 -60.2181 Td -(3243 {) 3.612 Tj -0 -61.5272 Td -(3244 int pid;) 9.03 Tj -0 -62.8363 Td -(3245 ) 3.01 Tj -0 -64.1454 Td -(3246 if\(argint\(0, &pid\) < 0\)) 18.06 Tj -0 -65.4545 Td -(3247 return -1;) 11.438 Tj -0 -66.7636 Td -(3248 return proc_kill\(pid\);) 17.458 Tj -0 -68.0727 Td -(3249 }) 3.612 Tj -0 -72 Td -(Sheet 32) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysproc.c Page 2) 24.08 Tj -0 -3.92728 Td -(3250 int) 4.816 Tj -0 -5.23637 Td -(3251 sys_getpid\(void\)) 12.642 Tj -0 -6.54546 Td -(3252 {) 3.612 Tj -0 -7.85455 Td -(3253 return curproc[cpu\(\)]->pid;) 20.468 Tj -0 -9.16364 Td -(3254 }) 3.612 Tj -0 -10.4727 Td -(3255 ) 3.01 Tj -0 -11.7818 Td -(3256 int) 4.816 Tj -0 -13.0909 Td -(3257 sys_sbrk\(void\)) 11.438 Tj -0 -14.4 Td -(3258 {) 3.612 Tj -0 -15.7091 Td -(3259 int addr;) 9.632 Tj -0 -17.0182 Td -(3260 int n;) 7.826 Tj -0 -18.3273 Td -(3261 struct proc *cp = curproc[cpu\(\)];) 24.08 Tj -0 -19.6364 Td -(3262 ) 3.01 Tj -0 -20.9455 Td -(3263 if\(argint\(0, &n\) < 0\)) 16.856 Tj -0 -22.2545 Td -(3264 return -1;) 11.438 Tj -0 -23.5636 Td -(3265 if\(\(addr = growproc\(n\)\) < 0\)) 21.07 Tj -0 -24.8727 Td -(3266 return -1;) 11.438 Tj -0 -26.1818 Td -(3267 setupsegs\(cp\);) 12.642 Tj -0 -27.4909 Td -(3268 return addr;) 11.438 Tj -0 -28.8 Td -(3269 }) 3.612 Tj -0 -30.1091 Td -(3270 ) 3.01 Tj -0 -31.4182 Td -(3271 ) 3.01 Tj -0 -32.7273 Td -(3272 ) 3.01 Tj -0 -34.0364 Td -(3273 ) 3.01 Tj -0 -35.3454 Td -(3274 ) 3.01 Tj -0 -36.6545 Td -(3275 ) 3.01 Tj -0 -37.9636 Td -(3276 ) 3.01 Tj -0 -39.2727 Td -(3277 ) 3.01 Tj -0 -40.5818 Td -(3278 ) 3.01 Tj -0 -41.8909 Td -(3279 ) 3.01 Tj -0 -43.2 Td -(3280 ) 3.01 Tj -0 -44.5091 Td -(3281 ) 3.01 Tj -0 -45.8182 Td -(3282 ) 3.01 Tj -0 -47.1272 Td -(3283 ) 3.01 Tj -0 -48.4363 Td -(3284 ) 3.01 Tj -0 -49.7454 Td -(3285 ) 3.01 Tj -0 -51.0545 Td -(3286 ) 3.01 Tj -0 -52.3636 Td -(3287 ) 3.01 Tj -0 -53.6727 Td -(3288 ) 3.01 Tj -0 -54.9818 Td -(3289 ) 3.01 Tj -0 -56.2909 Td -(3290 ) 3.01 Tj -0 -57.6 Td -(3291 ) 3.01 Tj -0 -58.9091 Td -(3292 ) 3.01 Tj -0 -60.2181 Td -(3293 ) 3.01 Tj -0 -61.5272 Td -(3294 ) 3.01 Tj -0 -62.8363 Td -(3295 ) 3.01 Tj -0 -64.1454 Td -(3296 ) 3.01 Tj -0 -65.4545 Td -(3297 ) 3.01 Tj -0 -66.7636 Td -(3298 ) 3.01 Tj -0 -68.0727 Td -(3299 ) 3.01 Tj -0 -72 Td -(Sheet 32) 4.816 Tj +/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 @@ -11804,7 +12585,10 @@ pdfEndPage %%Page: 40 40 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -11812,241 +12596,257 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/buf.h Page 1) 21.672 Tj -0 -3.92728 Td -(3300 struct buf {) 10.234 Tj -0 -5.23637 Td -(3301 int flags;) 10.234 Tj -0 -6.54546 Td -(3302 uint dev;) 9.632 Tj -0 -7.85455 Td -(3303 uint sector;) 11.438 Tj -0 -9.16364 Td -(3304 struct buf *prev;) 14.448 Tj -0 -10.4727 Td -(3305 struct buf *next;) 14.448 Tj -0 -11.7818 Td -(3306 uchar data[512];) 13.846 Tj -0 -13.0909 Td -(3307 };) 4.214 Tj -0 -14.4 Td -(3308 #define B_BUSY 0x1 // buffer is locked by some process) 36.12 Tj -0 -15.7091 Td -(3309 #define B_VALID 0x2 // buffer contains the data of the sector) 39.732 Tj -0 -17.0182 Td -(3310 ) 3.01 Tj -0 -18.3273 Td -(3311 ) 3.01 Tj -0 -19.6364 Td -(3312 ) 3.01 Tj -0 -20.9455 Td -(3313 ) 3.01 Tj -0 -22.2545 Td -(3314 ) 3.01 Tj -0 -23.5636 Td -(3315 ) 3.01 Tj -0 -24.8727 Td -(3316 ) 3.01 Tj -0 -26.1818 Td -(3317 ) 3.01 Tj -0 -27.4909 Td -(3318 ) 3.01 Tj -0 -28.8 Td -(3319 ) 3.01 Tj -0 -30.1091 Td -(3320 ) 3.01 Tj -0 -31.4182 Td -(3321 ) 3.01 Tj -0 -32.7273 Td -(3322 ) 3.01 Tj -0 -34.0364 Td -(3323 ) 3.01 Tj -0 -35.3454 Td -(3324 ) 3.01 Tj -0 -36.6545 Td -(3325 ) 3.01 Tj -0 -37.9636 Td -(3326 ) 3.01 Tj -0 -39.2727 Td -(3327 ) 3.01 Tj -0 -40.5818 Td -(3328 ) 3.01 Tj -0 -41.8909 Td -(3329 ) 3.01 Tj -0 -43.2 Td -(3330 ) 3.01 Tj -0 -44.5091 Td -(3331 ) 3.01 Tj -0 -45.8182 Td -(3332 ) 3.01 Tj -0 -47.1272 Td -(3333 ) 3.01 Tj -0 -48.4363 Td -(3334 ) 3.01 Tj -0 -49.7454 Td -(3335 ) 3.01 Tj -0 -51.0545 Td -(3336 ) 3.01 Tj -0 -52.3636 Td -(3337 ) 3.01 Tj -0 -53.6727 Td -(3338 ) 3.01 Tj -0 -54.9818 Td -(3339 ) 3.01 Tj -0 -56.2909 Td -(3340 ) 3.01 Tj -0 -57.6 Td -(3341 ) 3.01 Tj -0 -58.9091 Td -(3342 ) 3.01 Tj -0 -60.2181 Td -(3343 ) 3.01 Tj -0 -61.5272 Td -(3344 ) 3.01 Tj -0 -62.8363 Td -(3345 ) 3.01 Tj -0 -64.1454 Td -(3346 ) 3.01 Tj -0 -65.4545 Td -(3347 ) 3.01 Tj -0 -66.7636 Td -(3348 ) 3.01 Tj -0 -68.0727 Td -(3349 ) 3.01 Tj -0 -72 Td -(Sheet 33) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/dev.h Page 1) 21.672 Tj -0 -3.92728 Td -(3350 struct devsw {) 11.438 Tj -0 -5.23637 Td -(3351 int \(*read\)\(int, char*, int\);) 21.672 Tj -0 -6.54546 Td -(3352 int \(*write\)\(int, char*, int\);) 22.274 Tj -0 -7.85455 Td -(3353 };) 4.214 Tj -0 -9.16364 Td -(3354 ) 3.01 Tj -0 -10.4727 Td -(3355 extern struct devsw devsw[];) 19.866 Tj -0 -11.7818 Td -(3356 ) 3.01 Tj -0 -13.0909 Td -(3357 #define CONSOLE 1) 13.244 Tj -0 -14.4 Td -(3358 ) 3.01 Tj -0 -15.7091 Td -(3359 ) 3.01 Tj -0 -17.0182 Td -(3360 ) 3.01 Tj -0 -18.3273 Td -(3361 ) 3.01 Tj -0 -19.6364 Td -(3362 ) 3.01 Tj -0 -20.9455 Td -(3363 ) 3.01 Tj -0 -22.2545 Td -(3364 ) 3.01 Tj -0 -23.5636 Td -(3365 ) 3.01 Tj -0 -24.8727 Td -(3366 ) 3.01 Tj -0 -26.1818 Td -(3367 ) 3.01 Tj -0 -27.4909 Td -(3368 ) 3.01 Tj -0 -28.8 Td -(3369 ) 3.01 Tj -0 -30.1091 Td -(3370 ) 3.01 Tj -0 -31.4182 Td -(3371 ) 3.01 Tj -0 -32.7273 Td -(3372 ) 3.01 Tj -0 -34.0364 Td -(3373 ) 3.01 Tj -0 -35.3454 Td -(3374 ) 3.01 Tj -0 -36.6545 Td -(3375 ) 3.01 Tj -0 -37.9636 Td -(3376 ) 3.01 Tj -0 -39.2727 Td -(3377 ) 3.01 Tj -0 -40.5818 Td -(3378 ) 3.01 Tj -0 -41.8909 Td -(3379 ) 3.01 Tj -0 -43.2 Td -(3380 ) 3.01 Tj -0 -44.5091 Td -(3381 ) 3.01 Tj -0 -45.8182 Td -(3382 ) 3.01 Tj -0 -47.1272 Td -(3383 ) 3.01 Tj -0 -48.4363 Td -(3384 ) 3.01 Tj -0 -49.7454 Td -(3385 ) 3.01 Tj -0 -51.0545 Td -(3386 ) 3.01 Tj -0 -52.3636 Td -(3387 ) 3.01 Tj -0 -53.6727 Td -(3388 ) 3.01 Tj -0 -54.9818 Td -(3389 ) 3.01 Tj -0 -56.2909 Td -(3390 ) 3.01 Tj -0 -57.6 Td -(3391 ) 3.01 Tj -0 -58.9091 Td -(3392 ) 3.01 Tj -0 -60.2181 Td -(3393 ) 3.01 Tj -0 -61.5272 Td -(3394 ) 3.01 Tj -0 -62.8363 Td -(3395 ) 3.01 Tj -0 -64.1454 Td -(3396 ) 3.01 Tj -0 -65.4545 Td -(3397 ) 3.01 Tj -0 -66.7636 Td -(3398 ) 3.01 Tj -0 -68.0727 Td -(3399 ) 3.01 Tj -0 -72 Td -(Sheet 33) 4.816 Tj +/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 @@ -12058,6 +12858,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -12065,241 +12868,255 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fcntl.h Page 1) 22.876 Tj -0 -3.92728 Td -(3400 #define O_CREATE 0x200) 16.856 Tj -0 -5.23637 Td -(3401 #define O_RDONLY 0x000) 16.856 Tj -0 -6.54546 Td -(3402 #define O_WRONLY 0x001) 16.856 Tj -0 -7.85455 Td -(3403 #define O_RDWR 0x002) 16.856 Tj -0 -9.16364 Td -(3404 ) 3.01 Tj -0 -10.4727 Td -(3405 ) 3.01 Tj -0 -11.7818 Td -(3406 ) 3.01 Tj -0 -13.0909 Td -(3407 ) 3.01 Tj -0 -14.4 Td -(3408 ) 3.01 Tj -0 -15.7091 Td -(3409 ) 3.01 Tj -0 -17.0182 Td -(3410 ) 3.01 Tj -0 -18.3273 Td -(3411 ) 3.01 Tj -0 -19.6364 Td -(3412 ) 3.01 Tj -0 -20.9455 Td -(3413 ) 3.01 Tj -0 -22.2545 Td -(3414 ) 3.01 Tj -0 -23.5636 Td -(3415 ) 3.01 Tj -0 -24.8727 Td -(3416 ) 3.01 Tj -0 -26.1818 Td -(3417 ) 3.01 Tj -0 -27.4909 Td -(3418 ) 3.01 Tj -0 -28.8 Td -(3419 ) 3.01 Tj -0 -30.1091 Td -(3420 ) 3.01 Tj -0 -31.4182 Td -(3421 ) 3.01 Tj -0 -32.7273 Td -(3422 ) 3.01 Tj -0 -34.0364 Td -(3423 ) 3.01 Tj -0 -35.3454 Td -(3424 ) 3.01 Tj -0 -36.6545 Td -(3425 ) 3.01 Tj -0 -37.9636 Td -(3426 ) 3.01 Tj -0 -39.2727 Td -(3427 ) 3.01 Tj -0 -40.5818 Td -(3428 ) 3.01 Tj -0 -41.8909 Td -(3429 ) 3.01 Tj -0 -43.2 Td -(3430 ) 3.01 Tj -0 -44.5091 Td -(3431 ) 3.01 Tj -0 -45.8182 Td -(3432 ) 3.01 Tj -0 -47.1272 Td -(3433 ) 3.01 Tj -0 -48.4363 Td -(3434 ) 3.01 Tj -0 -49.7454 Td -(3435 ) 3.01 Tj -0 -51.0545 Td -(3436 ) 3.01 Tj -0 -52.3636 Td -(3437 ) 3.01 Tj -0 -53.6727 Td -(3438 ) 3.01 Tj -0 -54.9818 Td -(3439 ) 3.01 Tj -0 -56.2909 Td -(3440 ) 3.01 Tj -0 -57.6 Td -(3441 ) 3.01 Tj -0 -58.9091 Td -(3442 ) 3.01 Tj -0 -60.2181 Td -(3443 ) 3.01 Tj -0 -61.5272 Td -(3444 ) 3.01 Tj -0 -62.8363 Td -(3445 ) 3.01 Tj -0 -64.1454 Td -(3446 ) 3.01 Tj -0 -65.4545 Td -(3447 ) 3.01 Tj -0 -66.7636 Td -(3448 ) 3.01 Tj -0 -68.0727 Td -(3449 ) 3.01 Tj -0 -72 Td -(Sheet 34) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/stat.h Page 1) 22.274 Tj -0 -3.92728 Td -(3450 struct stat {) 10.836 Tj -0 -5.23637 Td -(3451 int dev; // Device number) 21.672 Tj -0 -6.54546 Td -(3452 uint ino; // Inode number on device) 27.09 Tj -0 -7.85455 Td -(3453 short type; // Type of file) 21.07 Tj -0 -9.16364 Td -(3454 short nlink; // Number of links to file) 27.692 Tj -0 -10.4727 Td -(3455 uint size; // Size of file in bytes) 26.488 Tj -0 -11.7818 Td -(3456 };) 4.214 Tj -0 -13.0909 Td -(3457 ) 3.01 Tj -0 -14.4 Td -(3458 ) 3.01 Tj -0 -15.7091 Td -(3459 ) 3.01 Tj -0 -17.0182 Td -(3460 ) 3.01 Tj -0 -18.3273 Td -(3461 ) 3.01 Tj -0 -19.6364 Td -(3462 ) 3.01 Tj -0 -20.9455 Td -(3463 ) 3.01 Tj -0 -22.2545 Td -(3464 ) 3.01 Tj -0 -23.5636 Td -(3465 ) 3.01 Tj -0 -24.8727 Td -(3466 ) 3.01 Tj -0 -26.1818 Td -(3467 ) 3.01 Tj -0 -27.4909 Td -(3468 ) 3.01 Tj -0 -28.8 Td -(3469 ) 3.01 Tj -0 -30.1091 Td -(3470 ) 3.01 Tj -0 -31.4182 Td -(3471 ) 3.01 Tj -0 -32.7273 Td -(3472 ) 3.01 Tj -0 -34.0364 Td -(3473 ) 3.01 Tj -0 -35.3454 Td -(3474 ) 3.01 Tj -0 -36.6545 Td -(3475 ) 3.01 Tj -0 -37.9636 Td -(3476 ) 3.01 Tj -0 -39.2727 Td -(3477 ) 3.01 Tj -0 -40.5818 Td -(3478 ) 3.01 Tj -0 -41.8909 Td -(3479 ) 3.01 Tj -0 -43.2 Td -(3480 ) 3.01 Tj -0 -44.5091 Td -(3481 ) 3.01 Tj -0 -45.8182 Td -(3482 ) 3.01 Tj -0 -47.1272 Td -(3483 ) 3.01 Tj -0 -48.4363 Td -(3484 ) 3.01 Tj -0 -49.7454 Td -(3485 ) 3.01 Tj -0 -51.0545 Td -(3486 ) 3.01 Tj -0 -52.3636 Td -(3487 ) 3.01 Tj -0 -53.6727 Td -(3488 ) 3.01 Tj -0 -54.9818 Td -(3489 ) 3.01 Tj -0 -56.2909 Td -(3490 ) 3.01 Tj -0 -57.6 Td -(3491 ) 3.01 Tj -0 -58.9091 Td -(3492 ) 3.01 Tj -0 -60.2181 Td -(3493 ) 3.01 Tj -0 -61.5272 Td -(3494 ) 3.01 Tj -0 -62.8363 Td -(3495 ) 3.01 Tj -0 -64.1454 Td -(3496 ) 3.01 Tj -0 -65.4545 Td -(3497 ) 3.01 Tj -0 -66.7636 Td -(3498 ) 3.01 Tj -0 -68.0727 Td -(3499 ) 3.01 Tj -0 -72 Td -(Sheet 34) 4.816 Tj +/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 @@ -12310,7 +13127,10 @@ pdfEndPage %%Page: 42 42 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -12318,241 +13138,259 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/file.h Page 1) 22.274 Tj -0 -3.92728 Td -(3500 struct file {) 10.836 Tj -0 -5.23637 Td -(3501 enum { FD_CLOSED, FD_NONE, FD_PIPE, FD_FILE } type;) 34.916 Tj -0 -6.54546 Td -(3502 int ref; // reference count) 20.468 Tj -0 -7.85455 Td -(3503 char readable;) 12.642 Tj -0 -9.16364 Td -(3504 char writable;) 12.642 Tj -0 -10.4727 Td -(3505 struct pipe *pipe;) 15.05 Tj -0 -11.7818 Td -(3506 struct inode *ip;) 14.448 Tj -0 -13.0909 Td -(3507 uint off;) 9.632 Tj -0 -14.4 Td -(3508 };) 4.214 Tj -0 -15.7091 Td -(3509 ) 3.01 Tj -0 -17.0182 Td -(3510 ) 3.01 Tj -0 -18.3273 Td -(3511 ) 3.01 Tj -0 -19.6364 Td -(3512 ) 3.01 Tj -0 -20.9455 Td -(3513 ) 3.01 Tj -0 -22.2545 Td -(3514 ) 3.01 Tj -0 -23.5636 Td -(3515 ) 3.01 Tj -0 -24.8727 Td -(3516 ) 3.01 Tj -0 -26.1818 Td -(3517 ) 3.01 Tj -0 -27.4909 Td -(3518 ) 3.01 Tj -0 -28.8 Td -(3519 ) 3.01 Tj -0 -30.1091 Td -(3520 ) 3.01 Tj -0 -31.4182 Td -(3521 ) 3.01 Tj -0 -32.7273 Td -(3522 ) 3.01 Tj -0 -34.0364 Td -(3523 ) 3.01 Tj -0 -35.3454 Td -(3524 ) 3.01 Tj -0 -36.6545 Td -(3525 ) 3.01 Tj -0 -37.9636 Td -(3526 ) 3.01 Tj -0 -39.2727 Td -(3527 ) 3.01 Tj -0 -40.5818 Td -(3528 ) 3.01 Tj -0 -41.8909 Td -(3529 ) 3.01 Tj -0 -43.2 Td -(3530 ) 3.01 Tj -0 -44.5091 Td -(3531 ) 3.01 Tj -0 -45.8182 Td -(3532 ) 3.01 Tj -0 -47.1272 Td -(3533 ) 3.01 Tj -0 -48.4363 Td -(3534 ) 3.01 Tj -0 -49.7454 Td -(3535 ) 3.01 Tj -0 -51.0545 Td -(3536 ) 3.01 Tj -0 -52.3636 Td -(3537 ) 3.01 Tj -0 -53.6727 Td -(3538 ) 3.01 Tj -0 -54.9818 Td -(3539 ) 3.01 Tj -0 -56.2909 Td -(3540 ) 3.01 Tj -0 -57.6 Td -(3541 ) 3.01 Tj -0 -58.9091 Td -(3542 ) 3.01 Tj -0 -60.2181 Td -(3543 ) 3.01 Tj -0 -61.5272 Td -(3544 ) 3.01 Tj -0 -62.8363 Td -(3545 ) 3.01 Tj -0 -64.1454 Td -(3546 ) 3.01 Tj -0 -65.4545 Td -(3547 ) 3.01 Tj -0 -66.7636 Td -(3548 ) 3.01 Tj -0 -68.0727 Td -(3549 ) 3.01 Tj -0 -72 Td -(Sheet 35) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.h Page 1) 21.07 Tj -0 -3.92728 Td -(3550 // On-disk file system format.) 21.07 Tj -0 -5.23637 Td -(3551 // This header is shared between kernel and user space.) 36.12 Tj -0 -6.54546 Td -(3552 ) 3.01 Tj -0 -7.85455 Td -(3553 // Block 0 is unused.) 15.652 Tj -0 -9.16364 Td -(3554 // Block 1 is super block.) 18.662 Tj -0 -10.4727 Td -(3555 // Inodes start at block 2.) 19.264 Tj -0 -11.7818 Td -(3556 ) 3.01 Tj -0 -13.0909 Td -(3557 #define BSIZE 512 // block size) 22.274 Tj -0 -14.4 Td -(3558 ) 3.01 Tj -0 -15.7091 Td -(3559 // File system super block) 18.662 Tj -0 -17.0182 Td -(3560 struct superblock {) 14.448 Tj -0 -18.3273 Td -(3561 uint size; // Size of file system image \(blocks\)) 37.926 Tj -0 -19.6364 Td -(3562 uint nblocks; // Number of data blocks) 30.1 Tj -0 -20.9455 Td -(3563 uint ninodes; // Number of inodes.) 27.692 Tj -0 -22.2545 Td -(3564 };) 4.214 Tj -0 -23.5636 Td -(3565 ) 3.01 Tj -0 -24.8727 Td -(3566 #define NADDRS \(NDIRECT+1\)) 18.662 Tj -0 -26.1818 Td -(3567 #define NDIRECT 12) 13.846 Tj -0 -27.4909 Td -(3568 #define INDIRECT 12) 14.448 Tj -0 -28.8 Td -(3569 #define NINDIRECT \(BSIZE / sizeof\(uint\)\)) 27.09 Tj -0 -30.1091 Td -(3570 #define MAXFILE \(NDIRECT + NINDIRECT\)) 25.886 Tj -0 -31.4182 Td -(3571 ) 3.01 Tj -0 -32.7273 Td -(3572 // On-disk inode structure) 18.662 Tj -0 -34.0364 Td -(3573 struct dinode {) 12.04 Tj -0 -35.3454 Td -(3574 short type; // File type) 24.682 Tj -0 -36.6545 Td -(3575 short major; // Major device number \(T_DEV only\)) 38.528 Tj -0 -37.9636 Td -(3576 short minor; // Minor device number \(T_DEV only\)) 38.528 Tj -0 -39.2727 Td -(3577 short nlink; // Number of links to inode in file system) 42.742 Tj -0 -40.5818 Td -(3578 uint size; // Size of file \(bytes\)) 31.304 Tj -0 -41.8909 Td -(3579 uint addrs[NADDRS]; // Data block addresses) 31.304 Tj -0 -43.2 Td -(3580 };) 4.214 Tj -0 -44.5091 Td -(3581 ) 3.01 Tj -0 -45.8182 Td -(3582 #define T_DIR 1 // Directory) 21.672 Tj -0 -47.1272 Td -(3583 #define T_FILE 2 // File) 18.662 Tj -0 -48.4363 Td -(3584 #define T_DEV 3 // Special device) 24.682 Tj -0 -49.7454 Td -(3585 ) 3.01 Tj -0 -51.0545 Td -(3586 // Inodes per block.) 15.05 Tj -0 -52.3636 Td -(3587 #define IPB \(BSIZE / sizeof\(struct dinode\)\)) 34.916 Tj -0 -53.6727 Td -(3588 ) 3.01 Tj -0 -54.9818 Td -(3589 // Block containing inode i) 19.264 Tj -0 -56.2909 Td -(3590 #define IBLOCK\(i\) \(\(i\) / IPB + 2\)) 25.284 Tj -0 -57.6 Td -(3591 ) 3.01 Tj -0 -58.9091 Td -(3592 // Bitmap bits per block) 17.458 Tj -0 -60.2181 Td -(3593 #define BPB \(BSIZE*8\)) 21.672 Tj -0 -61.5272 Td -(3594 ) 3.01 Tj -0 -62.8363 Td -(3595 // Block containing bit for block b) 24.08 Tj -0 -64.1454 Td -(3596 #define BBLOCK\(b, ninodes\) \(b/BPB + \(ninodes\)/IPB + 3\)) 35.518 Tj -0 -65.4545 Td -(3597 ) 3.01 Tj -0 -66.7636 Td -(3598 ) 3.01 Tj -0 -68.0727 Td -(3599 ) 3.01 Tj -0 -72 Td -(Sheet 35) 4.816 Tj +/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 @@ -12564,6 +13402,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -12571,241 +13412,259 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.h Page 2) 21.07 Tj -0 -3.92728 Td -(3600 // Directory is a file containing a sequence of dirent structures.) 42.742 Tj -0 -5.23637 Td -(3601 #define DIRSIZ 14) 13.244 Tj -0 -6.54546 Td -(3602 ) 3.01 Tj -0 -7.85455 Td -(3603 struct dirent {) 12.04 Tj -0 -9.16364 Td -(3604 ushort inum;) 11.438 Tj -0 -10.4727 Td -(3605 char name[DIRSIZ];) 15.05 Tj -0 -11.7818 Td -(3606 };) 4.214 Tj -0 -13.0909 Td -(3607 ) 3.01 Tj -0 -14.4 Td -(3608 extern uint rootdev; // Device number of root file system) 37.926 Tj -0 -15.7091 Td -(3609 ) 3.01 Tj -0 -17.0182 Td -(3610 ) 3.01 Tj -0 -18.3273 Td -(3611 ) 3.01 Tj -0 -19.6364 Td -(3612 ) 3.01 Tj -0 -20.9455 Td -(3613 ) 3.01 Tj -0 -22.2545 Td -(3614 ) 3.01 Tj -0 -23.5636 Td -(3615 ) 3.01 Tj -0 -24.8727 Td -(3616 ) 3.01 Tj -0 -26.1818 Td -(3617 ) 3.01 Tj -0 -27.4909 Td -(3618 ) 3.01 Tj -0 -28.8 Td -(3619 ) 3.01 Tj -0 -30.1091 Td -(3620 ) 3.01 Tj -0 -31.4182 Td -(3621 ) 3.01 Tj -0 -32.7273 Td -(3622 ) 3.01 Tj -0 -34.0364 Td -(3623 ) 3.01 Tj -0 -35.3454 Td -(3624 ) 3.01 Tj -0 -36.6545 Td -(3625 ) 3.01 Tj -0 -37.9636 Td -(3626 ) 3.01 Tj -0 -39.2727 Td -(3627 ) 3.01 Tj -0 -40.5818 Td -(3628 ) 3.01 Tj -0 -41.8909 Td -(3629 ) 3.01 Tj -0 -43.2 Td -(3630 ) 3.01 Tj -0 -44.5091 Td -(3631 ) 3.01 Tj -0 -45.8182 Td -(3632 ) 3.01 Tj -0 -47.1272 Td -(3633 ) 3.01 Tj -0 -48.4363 Td -(3634 ) 3.01 Tj -0 -49.7454 Td -(3635 ) 3.01 Tj -0 -51.0545 Td -(3636 ) 3.01 Tj -0 -52.3636 Td -(3637 ) 3.01 Tj -0 -53.6727 Td -(3638 ) 3.01 Tj -0 -54.9818 Td -(3639 ) 3.01 Tj -0 -56.2909 Td -(3640 ) 3.01 Tj -0 -57.6 Td -(3641 ) 3.01 Tj -0 -58.9091 Td -(3642 ) 3.01 Tj -0 -60.2181 Td -(3643 ) 3.01 Tj -0 -61.5272 Td -(3644 ) 3.01 Tj -0 -62.8363 Td -(3645 ) 3.01 Tj -0 -64.1454 Td -(3646 ) 3.01 Tj -0 -65.4545 Td -(3647 ) 3.01 Tj -0 -66.7636 Td -(3648 ) 3.01 Tj -0 -68.0727 Td -(3649 ) 3.01 Tj -0 -72 Td -(Sheet 36) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fsvar.h Page 1) 22.876 Tj -0 -3.92728 Td -(3650 // in-core file system types) 19.866 Tj -0 -5.23637 Td -(3651 ) 3.01 Tj -0 -6.54546 Td -(3652 struct inode {) 11.438 Tj -0 -7.85455 Td -(3653 uint dev; // Device number) 25.886 Tj -0 -9.16364 Td -(3654 uint inum; // Inode number) 25.284 Tj -0 -10.4727 Td -(3655 int ref; // Reference count) 27.09 Tj -0 -11.7818 Td -(3656 int busy; // Is the inode "locked"?) 31.304 Tj -0 -13.0909 Td -(3657 ) 3.01 Tj -0 -14.4 Td -(3658 short type; // copy of disk inode) 28.896 Tj -0 -15.7091 Td -(3659 short major;) 11.438 Tj -0 -17.0182 Td -(3660 short minor;) 11.438 Tj -0 -18.3273 Td -(3661 short nlink;) 11.438 Tj -0 -19.6364 Td -(3662 uint size;) 10.234 Tj -0 -20.9455 Td -(3663 uint addrs[NADDRS];) 15.652 Tj -0 -22.2545 Td -(3664 };) 4.214 Tj -0 -23.5636 Td -(3665 ) 3.01 Tj -0 -24.8727 Td -(3666 extern uint rootdev;) 15.05 Tj -0 -26.1818 Td -(3667 ) 3.01 Tj -0 -27.4909 Td -(3668 #define NAMEI_LOOKUP 1) 16.254 Tj -0 -28.8 Td -(3669 #define NAMEI_CREATE 2) 16.254 Tj -0 -30.1091 Td -(3670 #define NAMEI_DELETE 3) 16.254 Tj -0 -31.4182 Td -(3671 ) 3.01 Tj -0 -32.7273 Td -(3672 ) 3.01 Tj -0 -34.0364 Td -(3673 ) 3.01 Tj -0 -35.3454 Td -(3674 ) 3.01 Tj -0 -36.6545 Td -(3675 ) 3.01 Tj -0 -37.9636 Td -(3676 ) 3.01 Tj -0 -39.2727 Td -(3677 ) 3.01 Tj -0 -40.5818 Td -(3678 ) 3.01 Tj -0 -41.8909 Td -(3679 ) 3.01 Tj -0 -43.2 Td -(3680 ) 3.01 Tj -0 -44.5091 Td -(3681 ) 3.01 Tj -0 -45.8182 Td -(3682 ) 3.01 Tj -0 -47.1272 Td -(3683 ) 3.01 Tj -0 -48.4363 Td -(3684 ) 3.01 Tj -0 -49.7454 Td -(3685 ) 3.01 Tj -0 -51.0545 Td -(3686 ) 3.01 Tj -0 -52.3636 Td -(3687 ) 3.01 Tj -0 -53.6727 Td -(3688 ) 3.01 Tj -0 -54.9818 Td -(3689 ) 3.01 Tj -0 -56.2909 Td -(3690 ) 3.01 Tj -0 -57.6 Td -(3691 ) 3.01 Tj -0 -58.9091 Td -(3692 ) 3.01 Tj -0 -60.2181 Td -(3693 ) 3.01 Tj -0 -61.5272 Td -(3694 ) 3.01 Tj -0 -62.8363 Td -(3695 ) 3.01 Tj -0 -64.1454 Td -(3696 ) 3.01 Tj -0 -65.4545 Td -(3697 ) 3.01 Tj -0 -66.7636 Td -(3698 ) 3.01 Tj -0 -68.0727 Td -(3699 ) 3.01 Tj -0 -72 Td -(Sheet 36) 4.816 Tj +/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 @@ -12816,7 +13675,10 @@ pdfEndPage %%Page: 44 44 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -12824,241 +13686,267 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/ide.c Page 1) 21.672 Tj -0 -3.92728 Td -(3700 // Simple PIO-based \(non-DMA\) IDE driver code.) 30.702 Tj -0 -5.23637 Td -(3701 ) 3.01 Tj -0 -6.54546 Td -(3702 #include "types.h") 13.846 Tj -0 -7.85455 Td -(3703 #include "param.h") 13.846 Tj -0 -9.16364 Td -(3704 #include "mmu.h") 12.642 Tj -0 -10.4727 Td -(3705 #include "proc.h") 13.244 Tj -0 -11.7818 Td -(3706 #include "defs.h") 13.244 Tj -0 -13.0909 Td -(3707 #include "x86.h") 12.642 Tj -0 -14.4 Td -(3708 #include "traps.h") 13.846 Tj -0 -15.7091 Td -(3709 #include "spinlock.h") 15.652 Tj -0 -17.0182 Td -(3710 ) 3.01 Tj -0 -18.3273 Td -(3711 #define IDE_BSY 0x80) 18.662 Tj -0 -19.6364 Td -(3712 #define IDE_DRDY 0x40) 18.662 Tj -0 -20.9455 Td -(3713 #define IDE_DF 0x20) 18.662 Tj -0 -22.2545 Td -(3714 #define IDE_ERR 0x01) 18.662 Tj -0 -23.5636 Td -(3715 ) 3.01 Tj -0 -24.8727 Td -(3716 #define IDE_CMD_READ 0x20) 18.662 Tj -0 -26.1818 Td -(3717 #define IDE_CMD_WRITE 0x30) 18.662 Tj -0 -27.4909 Td -(3718 ) 3.01 Tj -0 -28.8 Td -(3719 // IDE request queue.) 15.652 Tj -0 -30.1091 Td -(3720 // The next request will be stored in request[head],) 34.314 Tj -0 -31.4182 Td -(3721 // and the request currently being served by the disk) 34.916 Tj -0 -32.7273 Td -(3722 // is request[tail].) 15.05 Tj -0 -34.0364 Td -(3723 // Must hold ide_lock while manipulating queue.) 31.304 Tj -0 -35.3454 Td -(3724 ) 3.01 Tj -0 -36.6545 Td -(3725 struct ide_request {) 15.05 Tj -0 -37.9636 Td -(3726 int diskno;) 10.836 Tj -0 -39.2727 Td -(3727 uint secno;) 10.836 Tj -0 -40.5818 Td -(3728 void *addr;) 10.836 Tj -0 -41.8909 Td -(3729 uint nsecs;) 10.836 Tj -0 -43.2 Td -(3730 uint read;) 10.234 Tj -0 -44.5091 Td -(3731 };) 4.214 Tj -0 -45.8182 Td -(3732 ) 3.01 Tj -0 -47.1272 Td -(3733 static struct ide_request request[NREQUEST];) 29.498 Tj -0 -48.4363 Td -(3734 static int head, tail;) 16.254 Tj -0 -49.7454 Td -(3735 static struct spinlock ide_lock;) 22.274 Tj -0 -51.0545 Td -(3736 ) 3.01 Tj -0 -52.3636 Td -(3737 static int disk_1_present;) 18.662 Tj -0 -53.6727 Td -(3738 static int disk_queue;) 16.254 Tj -0 -54.9818 Td -(3739 ) 3.01 Tj -0 -56.2909 Td -(3740 static int ide_probe_disk1\(void\);) 22.876 Tj -0 -57.6 Td -(3741 ) 3.01 Tj -0 -58.9091 Td -(3742 // Wait for IDE disk to become ready.) 25.284 Tj -0 -60.2181 Td -(3743 static int) 9.03 Tj -0 -61.5272 Td -(3744 ide_wait_ready\(int check_error\)) 21.672 Tj -0 -62.8363 Td -(3745 {) 3.612 Tj -0 -64.1454 Td -(3746 int r;) 7.826 Tj -0 -65.4545 Td -(3747 ) 3.01 Tj -0 -66.7636 Td -(3748 while\(\(\(r = inb\(0x1F7\)\) & \(IDE_BSY|IDE_DRDY\)\) != IDE_DRDY\)) 39.13 Tj -0 -68.0727 Td -(3749 ;) 6.02 Tj -0 -72 Td -(Sheet 37) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/ide.c Page 2) 21.672 Tj -0 -3.92728 Td -(3750 if\(check_error && \(r & \(IDE_DF|IDE_ERR\)\) != 0\)) 31.906 Tj -0 -5.23637 Td -(3751 return -1;) 11.438 Tj -0 -6.54546 Td -(3752 return 0;) 9.632 Tj -0 -7.85455 Td -(3753 }) 3.612 Tj -0 -9.16364 Td -(3754 ) 3.01 Tj -0 -10.4727 Td -(3755 void) 5.418 Tj -0 -11.7818 Td -(3756 ide_init\(void\)) 11.438 Tj -0 -13.0909 Td -(3757 {) 3.612 Tj -0 -14.4 Td -(3758 initlock\(&ide_lock, "ide"\);) 20.468 Tj -0 -15.7091 Td -(3759 irq_enable\(IRQ_IDE\);) 16.254 Tj -0 -17.0182 Td -(3760 ioapic_enable\(IRQ_IDE, ncpu - 1\);) 24.08 Tj -0 -18.3273 Td -(3761 ide_wait_ready\(0\);) 15.05 Tj -0 -19.6364 Td -(3762 disk_1_present = ide_probe_disk1\(\);) 25.284 Tj -0 -20.9455 Td -(3763 }) 3.612 Tj -0 -22.2545 Td -(3764 ) 3.01 Tj -0 -23.5636 Td -(3765 // Probe to see if disk 1 exists \(we assume disk 0 exists\).) 38.528 Tj -0 -24.8727 Td -(3766 static int) 9.03 Tj -0 -26.1818 Td -(3767 ide_probe_disk1\(void\)) 15.652 Tj -0 -27.4909 Td -(3768 {) 3.612 Tj -0 -28.8 Td -(3769 int r, x;) 9.632 Tj -0 -30.1091 Td -(3770 ) 3.01 Tj -0 -31.4182 Td -(3771 // wait for Device 0 to be ready) 23.478 Tj -0 -32.7273 Td -(3772 ide_wait_ready\(0\);) 15.05 Tj -0 -34.0364 Td -(3773 ) 3.01 Tj -0 -35.3454 Td -(3774 // switch to Device 1) 16.856 Tj -0 -36.6545 Td -(3775 outb\(0x1F6, 0xE0 | \(1<<4\)\);) 20.468 Tj -0 -37.9636 Td -(3776 ) 3.01 Tj -0 -39.2727 Td -(3777 // check for Device 1 to be ready for a while) 31.304 Tj -0 -40.5818 Td -(3778 for\(x = 0; x < 1000 && \(r = inb\(0x1F7\)\) == 0; x++\)) 34.314 Tj -0 -41.8909 Td -(3779 ;) 6.02 Tj -0 -43.2 Td -(3780 ) 3.01 Tj -0 -44.5091 Td -(3781 // switch back to Device 0) 19.866 Tj -0 -45.8182 Td -(3782 outb\(0x1F6, 0xE0 | \(0<<4\)\);) 20.468 Tj -0 -47.1272 Td -(3783 ) 3.01 Tj -0 -48.4363 Td -(3784 return x < 1000;) 13.846 Tj -0 -49.7454 Td -(3785 }) 3.612 Tj -0 -51.0545 Td -(3786 ) 3.01 Tj -0 -52.3636 Td -(3787 // Interrupt handler - wake up the request that just finished.) 40.334 Tj -0 -53.6727 Td -(3788 void) 5.418 Tj -0 -54.9818 Td -(3789 ide_intr\(void\)) 11.438 Tj -0 -56.2909 Td -(3790 {) 3.612 Tj -0 -57.6 Td -(3791 acquire\(&ide_lock\);) 15.652 Tj -0 -58.9091 Td -(3792 wakeup\(&request[tail]\);) 18.06 Tj -0 -60.2181 Td -(3793 release\(&ide_lock\);) 15.652 Tj -0 -61.5272 Td -(3794 }) 3.612 Tj -0 -62.8363 Td -(3795 ) 3.01 Tj -0 -64.1454 Td -(3796 ) 3.01 Tj -0 -65.4545 Td -(3797 ) 3.01 Tj -0 -66.7636 Td -(3798 ) 3.01 Tj -0 -68.0727 Td -(3799 ) 3.01 Tj -0 -72 Td -(Sheet 37) 4.816 Tj +/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 @@ -13070,6 +13958,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -13077,241 +13968,256 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/ide.c Page 3) 21.672 Tj -0 -3.92728 Td -(3800 // Start the next request in the queue.) 26.488 Tj -0 -5.23637 Td -(3801 static void) 9.632 Tj -0 -6.54546 Td -(3802 ide_start_request \(void\)) 17.458 Tj -0 -7.85455 Td -(3803 {) 3.612 Tj -0 -9.16364 Td -(3804 struct ide_request *r;) 17.458 Tj -0 -10.4727 Td -(3805 ) 3.01 Tj -0 -11.7818 Td -(3806 if\(head != tail\) {) 15.05 Tj -0 -13.0909 Td -(3807 r = &request[tail];) 16.856 Tj -0 -14.4 Td -(3808 ide_wait_ready\(0\);) 16.254 Tj -0 -15.7091 Td -(3809 outb\(0x3f6, 0\); // generate interrupt) 28.294 Tj -0 -17.0182 Td -(3810 outb\(0x1F2, r->nsecs\);) 18.662 Tj -0 -18.3273 Td -(3811 outb\(0x1F3, r->secno & 0xFF\);) 22.876 Tj -0 -19.6364 Td -(3812 outb\(0x1F4, \(r->secno >> 8\) & 0xFF\);) 27.09 Tj -0 -20.9455 Td -(3813 outb\(0x1F5, \(r->secno >> 16\) & 0xFF\);) 27.692 Tj -0 -22.2545 Td -(3814 outb\(0x1F6, 0xE0 | \(\(r->diskno&1\)<<4\) | \(\(r->secno>>24\)&0x0F\)\);) 43.344 Tj -0 -23.5636 Td -(3815 if\(r->read\)) 12.04 Tj -0 -24.8727 Td -(3816 outb\(0x1F7, IDE_CMD_READ\);) 22.274 Tj -0 -26.1818 Td -(3817 else {) 9.03 Tj -0 -27.4909 Td -(3818 outb\(0x1F7, IDE_CMD_WRITE\);) 22.876 Tj -0 -28.8 Td -(3819 outsl\(0x1F0, r->addr, 512/4\);) 24.08 Tj -0 -30.1091 Td -(3820 }) 6.02 Tj -0 -31.4182 Td -(3821 }) 4.816 Tj -0 -32.7273 Td -(3822 }) 3.612 Tj -0 -34.0364 Td -(3823 ) 3.01 Tj -0 -35.3454 Td -(3824 // Run an entire disk operation.) 22.274 Tj -0 -36.6545 Td -(3825 void) 5.418 Tj -0 -37.9636 Td -(3826 ide_rw\(int diskno, uint secno, void *addr, uint nsecs, int read\)) 41.538 Tj -0 -39.2727 Td -(3827 {) 3.612 Tj -0 -40.5818 Td -(3828 struct ide_request *r;) 17.458 Tj -0 -41.8909 Td -(3829 ) 3.01 Tj -0 -43.2 Td -(3830 if\(diskno && !disk_1_present\)) 21.672 Tj -0 -44.5091 Td -(3831 panic\("ide disk 1 not present"\);) 24.682 Tj -0 -45.8182 Td -(3832 ) 3.01 Tj -0 -47.1272 Td -(3833 acquire\(&ide_lock\);) 15.652 Tj -0 -48.4363 Td -(3834 ) 3.01 Tj -0 -49.7454 Td -(3835 // Add request to queue.) 18.662 Tj -0 -51.0545 Td -(3836 while\(\(head + 1\) % NREQUEST == tail\)) 25.886 Tj -0 -52.3636 Td -(3837 sleep\(&disk_queue, &ide_lock\);) 23.478 Tj -0 -53.6727 Td -(3838 ) 3.01 Tj -0 -54.9818 Td -(3839 r = &request[head];) 15.652 Tj -0 -56.2909 Td -(3840 r->secno = secno;) 14.448 Tj -0 -57.6 Td -(3841 r->addr = addr;) 13.244 Tj -0 -58.9091 Td -(3842 r->nsecs = nsecs;) 14.448 Tj -0 -60.2181 Td -(3843 r->diskno = diskno;) 15.652 Tj -0 -61.5272 Td -(3844 r->read = read;) 13.244 Tj -0 -62.8363 Td -(3845 head = \(head + 1\) % NREQUEST;) 21.672 Tj -0 -64.1454 Td -(3846 ) 3.01 Tj -0 -65.4545 Td -(3847 // Start request if necessary.) 22.274 Tj -0 -66.7636 Td -(3848 ide_start_request\(\);) 16.254 Tj -0 -68.0727 Td -(3849 ) 3.01 Tj -0 -72 Td -(Sheet 38) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/ide.c Page 4) 21.672 Tj -0 -3.92728 Td -(3850 // Wait for request to finish.) 22.274 Tj -0 -5.23637 Td -(3851 sleep\(r, &ide_lock\);) 16.254 Tj -0 -6.54546 Td -(3852 ) 3.01 Tj -0 -7.85455 Td -(3853 // Finish request.) 15.05 Tj -0 -9.16364 Td -(3854 if\(read\){) 9.632 Tj -0 -10.4727 Td -(3855 if\(ide_wait_ready\(1\) >= 0\)) 21.07 Tj -0 -11.7818 Td -(3856 insl\(0x1F0, addr, 512/4\);) 21.672 Tj -0 -13.0909 Td -(3857 }) 4.816 Tj -0 -14.4 Td -(3858 ) 3.01 Tj -0 -15.7091 Td -(3859 // Remove request from queue.) 21.672 Tj -0 -17.0182 Td -(3860 if\(\(head + 1\) % NREQUEST == tail\)) 24.08 Tj -0 -18.3273 Td -(3861 wakeup\(&disk_queue\);) 17.458 Tj -0 -19.6364 Td -(3862 tail = \(tail + 1\) % NREQUEST;) 21.672 Tj -0 -20.9455 Td -(3863 ) 3.01 Tj -0 -22.2545 Td -(3864 // Start next request in queue, if any.) 27.692 Tj -0 -23.5636 Td -(3865 ide_start_request\(\);) 16.254 Tj -0 -24.8727 Td -(3866 ) 3.01 Tj -0 -26.1818 Td -(3867 release\(&ide_lock\);) 15.652 Tj -0 -27.4909 Td -(3868 }) 3.612 Tj -0 -28.8 Td -(3869 ) 3.01 Tj -0 -30.1091 Td -(3870 // Synchronous disk write.) 18.662 Tj -0 -31.4182 Td -(3871 int) 4.816 Tj -0 -32.7273 Td -(3872 ide_write\(int diskno, uint secno, const void *src, uint nsecs\)) 40.334 Tj -0 -34.0364 Td -(3873 {) 3.612 Tj -0 -35.3454 Td -(3874 int r;) 7.826 Tj -0 -36.6545 Td -(3875 ) 3.01 Tj -0 -37.9636 Td -(3876 if\(nsecs > 256\)) 13.244 Tj -0 -39.2727 Td -(3877 panic\("ide_write"\);) 16.856 Tj -0 -40.5818 Td -(3878 ) 3.01 Tj -0 -41.8909 Td -(3879 ide_wait_ready\(0\);) 15.05 Tj -0 -43.2 Td -(3880 ) 3.01 Tj -0 -44.5091 Td -(3881 outb\(0x1F2, nsecs\);) 15.652 Tj -0 -45.8182 Td -(3882 outb\(0x1F3, secno & 0xFF\);) 19.866 Tj -0 -47.1272 Td -(3883 outb\(0x1F4, \(secno >> 8\) & 0xFF\);) 24.08 Tj -0 -48.4363 Td -(3884 outb\(0x1F5, \(secno >> 16\) & 0xFF\);) 24.682 Tj -0 -49.7454 Td -(3885 outb\(0x1F6, 0xE0 | \(\(diskno&1\)<<4\) | \(\(secno>>24\)&0x0F\)\);) 38.528 Tj -0 -51.0545 Td -(3886 outb\(0x1F7, 0x30\); // CMD 0x30 means write sector) 35.518 Tj -0 -52.3636 Td -(3887 ) 3.01 Tj -0 -53.6727 Td -(3888 for\(; nsecs > 0; nsecs--, src += 512\) {) 27.692 Tj -0 -54.9818 Td -(3889 if\(\(r = ide_wait_ready\(1\)\) < 0\)) 24.08 Tj -0 -56.2909 Td -(3890 return r;) 12.04 Tj -0 -57.6 Td -(3891 outsl\(0x1F0, src, 512/4\);) 20.468 Tj -0 -58.9091 Td -(3892 }) 4.816 Tj -0 -60.2181 Td -(3893 ) 3.01 Tj -0 -61.5272 Td -(3894 return 0;) 9.632 Tj -0 -62.8363 Td -(3895 }) 3.612 Tj -0 -64.1454 Td -(3896 ) 3.01 Tj -0 -65.4545 Td -(3897 ) 3.01 Tj -0 -66.7636 Td -(3898 ) 3.01 Tj -0 -68.0727 Td -(3899 ) 3.01 Tj -0 -72 Td -(Sheet 38) 4.816 Tj +/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 @@ -13322,7 +14228,10 @@ pdfEndPage %%Page: 46 46 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -13330,241 +14239,255 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/bio.c Page 1) 21.672 Tj -0 -3.92728 Td -(3900 // Buffer cache.) 12.642 Tj -0 -5.23637 Td -(3901 //) 4.214 Tj -0 -6.54546 Td -(3902 // The buffer cache is a linked list of buf structures) 35.518 Tj -0 -7.85455 Td -(3903 // holding cached copies of disk block contents.) 31.906 Tj -0 -9.16364 Td -(3904 // Each buf has two state bits B_BUSY and B_VALID.) 33.11 Tj -0 -10.4727 Td -(3905 // If B_BUSY is set, it means that some code is currently) 37.324 Tj -0 -11.7818 Td -(3906 // editing buf, so other code is not allowed to look at it.) 38.528 Tj -0 -13.0909 Td -(3907 // To wait for a buffer that is B_BUSY, sleep on buf.) 34.916 Tj -0 -14.4 Td -(3908 // \(See bget below.\)) 15.05 Tj -0 -15.7091 Td -(3909 //) 4.214 Tj -0 -17.0182 Td -(3910 // If B_VALID is set, it means that the memory contents) 36.12 Tj -0 -18.3273 Td -(3911 // have been initialized by reading them off the disk.) 35.518 Tj -0 -19.6364 Td -(3912 // \(Conversely, if B_VALID is not set, the memory contents) 37.926 Tj -0 -20.9455 Td -(3913 // of buf must be initialized, often by calling bread,) 35.518 Tj -0 -22.2545 Td -(3914 // before being used.\)) 16.254 Tj -0 -23.5636 Td -(3915 //) 4.214 Tj -0 -24.8727 Td -(3916 // After making changes to a buf's memory, call bwrite to flush) 40.936 Tj -0 -26.1818 Td -(3917 // the changes out to disk, to keep the disk and memory copies) 40.334 Tj -0 -27.4909 Td -(3918 // in sync.) 9.632 Tj -0 -28.8 Td -(3919 //) 4.214 Tj -0 -30.1091 Td -(3920 // When finished with a buffer, call brelse to release the buffer) 42.14 Tj -0 -31.4182 Td -(3921 // \(i.e., clear B_BUSY\), so that others can access it.) 35.518 Tj -0 -32.7273 Td -(3922 //) 4.214 Tj -0 -34.0364 Td -(3923 // Bufs that are not B_BUSY are fair game for reuse for other) 39.732 Tj -0 -35.3454 Td -(3924 // disk blocks. It is not allowed to use a buf after calling brelse.) 44.548 Tj -0 -36.6545 Td -(3925 ) 3.01 Tj -0 -37.9636 Td -(3926 #include "types.h") 13.846 Tj -0 -39.2727 Td -(3927 #include "param.h") 13.846 Tj -0 -40.5818 Td -(3928 #include "x86.h") 12.642 Tj -0 -41.8909 Td -(3929 #include "mmu.h") 12.642 Tj -0 -43.2 Td -(3930 #include "proc.h") 13.244 Tj -0 -44.5091 Td -(3931 #include "defs.h") 13.244 Tj -0 -45.8182 Td -(3932 #include "spinlock.h") 15.652 Tj -0 -47.1272 Td -(3933 #include "buf.h") 12.642 Tj -0 -48.4363 Td -(3934 ) 3.01 Tj -0 -49.7454 Td -(3935 struct buf buf[NBUF];) 15.652 Tj -0 -51.0545 Td -(3936 struct spinlock buf_table_lock;) 21.672 Tj -0 -52.3636 Td -(3937 ) 3.01 Tj -0 -53.6727 Td -(3938 // Linked list of all buffers, through prev/next.) 32.508 Tj -0 -54.9818 Td -(3939 // bufhead->next is most recently used.) 26.488 Tj -0 -56.2909 Td -(3940 // bufhead->tail is least recently used.) 27.09 Tj -0 -57.6 Td -(3941 struct buf bufhead;) 14.448 Tj -0 -58.9091 Td -(3942 ) 3.01 Tj -0 -60.2181 Td -(3943 void) 5.418 Tj -0 -61.5272 Td -(3944 binit\(void\)) 9.632 Tj -0 -62.8363 Td -(3945 {) 3.612 Tj -0 -64.1454 Td -(3946 struct buf *b;) 12.642 Tj -0 -65.4545 Td -(3947 ) 3.01 Tj -0 -66.7636 Td -(3948 initlock\(&buf_table_lock, "buf_table"\);) 27.692 Tj -0 -68.0727 Td -(3949 ) 3.01 Tj -0 -72 Td -(Sheet 39) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/bio.c Page 2) 21.672 Tj -0 -3.92728 Td -(3950 // Create linked list of buffers) 23.478 Tj -0 -5.23637 Td -(3951 bufhead.prev = &bufhead;) 18.662 Tj -0 -6.54546 Td -(3952 bufhead.next = &bufhead;) 18.662 Tj -0 -7.85455 Td -(3953 for\(b = buf; b < buf+NBUF; b++\){) 23.478 Tj -0 -9.16364 Td -(3954 b->next = bufhead.next;) 19.264 Tj -0 -10.4727 Td -(3955 b->prev = &bufhead;) 16.856 Tj -0 -11.7818 Td -(3956 bufhead.next->prev = b;) 19.264 Tj -0 -13.0909 Td -(3957 bufhead.next = b;) 15.652 Tj -0 -14.4 Td -(3958 }) 4.816 Tj -0 -15.7091 Td -(3959 }) 3.612 Tj -0 -17.0182 Td -(3960 ) 3.01 Tj -0 -18.3273 Td -(3961 // Look through buffer cache for block n on device dev.) 36.12 Tj -0 -19.6364 Td -(3962 // If not found, allocate fresh block.) 25.886 Tj -0 -20.9455 Td -(3963 // In either case, return locked buffer.) 27.09 Tj -0 -22.2545 Td -(3964 static struct buf*) 13.846 Tj -0 -23.5636 Td -(3965 bget\(uint dev, uint sector\)) 19.264 Tj -0 -24.8727 Td -(3966 {) 3.612 Tj -0 -26.1818 Td -(3967 struct buf *b;) 12.642 Tj -0 -27.4909 Td -(3968 ) 3.01 Tj -0 -28.8 Td -(3969 acquire\(&buf_table_lock\);) 19.264 Tj -0 -30.1091 Td -(3970 ) 3.01 Tj -0 -31.4182 Td -(3971 for\(;;\){) 9.03 Tj -0 -32.7273 Td -(3972 for\(b = bufhead.next; b != &bufhead; b = b->next\)) 34.916 Tj -0 -34.0364 Td -(3973 if\(\(b->flags & \(B_BUSY|B_VALID\)\) &&) 27.692 Tj -0 -35.3454 Td -(3974 b->dev == dev && b->sector == sector\)) 30.702 Tj -0 -36.6545 Td -(3975 break;) 11.438 Tj -0 -37.9636 Td -(3976 ) 3.01 Tj -0 -39.2727 Td -(3977 if\(b != &bufhead\){) 16.254 Tj -0 -40.5818 Td -(3978 if\(b->flags & B_BUSY\){) 19.866 Tj -0 -41.8909 Td -(3979 sleep\(buf, &buf_table_lock\);) 24.682 Tj -0 -43.2 Td -(3980 } else {) 11.438 Tj -0 -44.5091 Td -(3981 b->flags |= B_BUSY;) 19.264 Tj -0 -45.8182 Td -(3982 // b->flags &= ~B_VALID; // Force reread from disk) 37.926 Tj -0 -47.1272 Td -(3983 release\(&buf_table_lock\);) 22.876 Tj -0 -48.4363 Td -(3984 return b;) 13.244 Tj -0 -49.7454 Td -(3985 }) 7.224 Tj -0 -51.0545 Td -(3986 } else {) 10.234 Tj -0 -52.3636 Td -(3987 for\(b = bufhead.prev; b != &bufhead; b = b->prev\){) 36.722 Tj -0 -53.6727 Td -(3988 if\(\(b->flags & B_BUSY\) == 0\){) 25.284 Tj -0 -54.9818 Td -(3989 b->flags = B_BUSY;) 19.866 Tj -0 -56.2909 Td -(3990 b->dev = dev;) 16.856 Tj -0 -57.6 Td -(3991 b->sector = sector;) 20.468 Tj -0 -58.9091 Td -(3992 release\(&buf_table_lock\);) 24.08 Tj -0 -60.2181 Td -(3993 return b;) 14.448 Tj -0 -61.5272 Td -(3994 }) 8.428 Tj -0 -62.8363 Td -(3995 }) 7.224 Tj -0 -64.1454 Td -(3996 panic\("bget: no buffers"\);) 22.274 Tj -0 -65.4545 Td -(3997 }) 6.02 Tj -0 -66.7636 Td -(3998 }) 4.816 Tj -0 -68.0727 Td -(3999 }) 3.612 Tj -0 -72 Td -(Sheet 39) 4.816 Tj +/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 @@ -13576,6 +14499,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -13583,241 +14509,258 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/bio.c Page 3) 21.672 Tj -0 -3.92728 Td -(4000 // Read buf's contents from disk.) 22.876 Tj -0 -5.23637 Td -(4001 struct buf*) 9.632 Tj -0 -6.54546 Td -(4002 bread\(uint dev, uint sector\)) 19.866 Tj -0 -7.85455 Td -(4003 {) 3.612 Tj -0 -9.16364 Td -(4004 struct buf *b;) 12.642 Tj -0 -10.4727 Td -(4005 ) 3.01 Tj -0 -11.7818 Td -(4006 b = bget\(dev, sector\);) 17.458 Tj -0 -13.0909 Td -(4007 if\(b->flags & B_VALID\)) 17.458 Tj -0 -14.4 Td -(4008 return b;) 10.836 Tj -0 -15.7091 Td -(4009 ) 3.01 Tj -0 -17.0182 Td -(4010 ide_rw\(dev & 0xff, sector, b->data, 1, 1\);) 29.498 Tj -0 -18.3273 Td -(4011 b->flags |= B_VALID;) 16.254 Tj -0 -19.6364 Td -(4012 ) 3.01 Tj -0 -20.9455 Td -(4013 return b;) 9.632 Tj -0 -22.2545 Td -(4014 }) 3.612 Tj -0 -23.5636 Td -(4015 ) 3.01 Tj -0 -24.8727 Td -(4016 // Write buf's contents to disk.) 22.274 Tj -0 -26.1818 Td -(4017 // Must be locked.) 13.846 Tj -0 -27.4909 Td -(4018 void) 5.418 Tj -0 -28.8 Td -(4019 bwrite\(struct buf *b, uint sector\)) 23.478 Tj -0 -30.1091 Td -(4020 {) 3.612 Tj -0 -31.4182 Td -(4021 if\(\(b->flags & B_BUSY\) == 0\)) 21.07 Tj -0 -32.7273 Td -(4022 panic\("bwrite"\);) 15.05 Tj -0 -34.0364 Td -(4023 ) 3.01 Tj -0 -35.3454 Td -(4024 ide_rw\(b->dev & 0xff, sector, b->data, 1, 0\);) 31.304 Tj -0 -36.6545 Td -(4025 b->flags |= B_VALID;) 16.254 Tj -0 -37.9636 Td -(4026 }) 3.612 Tj -0 -39.2727 Td -(4027 ) 3.01 Tj -0 -40.5818 Td -(4028 // Release the buffer buf.) 18.662 Tj -0 -41.8909 Td -(4029 void) 5.418 Tj -0 -43.2 Td -(4030 brelse\(struct buf *b\)) 15.652 Tj -0 -44.5091 Td -(4031 {) 3.612 Tj -0 -45.8182 Td -(4032 if\(\(b->flags & B_BUSY\) == 0\)) 21.07 Tj -0 -47.1272 Td -(4033 panic\("brelse"\);) 15.05 Tj -0 -48.4363 Td -(4034 ) 3.01 Tj -0 -49.7454 Td -(4035 acquire\(&buf_table_lock\);) 19.264 Tj -0 -51.0545 Td -(4036 ) 3.01 Tj -0 -52.3636 Td -(4037 b->next->prev = b->prev;) 18.662 Tj -0 -53.6727 Td -(4038 b->prev->next = b->next;) 18.662 Tj -0 -54.9818 Td -(4039 b->next = bufhead.next;) 18.06 Tj -0 -56.2909 Td -(4040 b->prev = &bufhead;) 15.652 Tj -0 -57.6 Td -(4041 bufhead.next->prev = b;) 18.06 Tj -0 -58.9091 Td -(4042 bufhead.next = b;) 14.448 Tj -0 -60.2181 Td -(4043 ) 3.01 Tj -0 -61.5272 Td -(4044 b->flags &= ~B_BUSY;) 16.254 Tj -0 -62.8363 Td -(4045 wakeup\(buf\);) 11.438 Tj -0 -64.1454 Td -(4046 ) 3.01 Tj -0 -65.4545 Td -(4047 release\(&buf_table_lock\);) 19.264 Tj -0 -66.7636 Td -(4048 }) 3.612 Tj -0 -68.0727 Td -(4049 ) 3.01 Tj -0 -72 Td -(Sheet 40) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 1) 21.07 Tj -0 -3.92728 Td -(4050 #include "types.h") 13.846 Tj -0 -5.23637 Td -(4051 #include "stat.h") 13.244 Tj -0 -6.54546 Td -(4052 #include "param.h") 13.846 Tj -0 -7.85455 Td -(4053 #include "x86.h") 12.642 Tj -0 -9.16364 Td -(4054 #include "mmu.h") 12.642 Tj -0 -10.4727 Td -(4055 #include "proc.h") 13.244 Tj -0 -11.7818 Td -(4056 #include "defs.h") 13.244 Tj -0 -13.0909 Td -(4057 #include "spinlock.h") 15.652 Tj -0 -14.4 Td -(4058 #include "buf.h") 12.642 Tj -0 -15.7091 Td -(4059 #include "fs.h") 12.04 Tj -0 -17.0182 Td -(4060 #include "fsvar.h") 13.846 Tj -0 -18.3273 Td -(4061 #include "dev.h") 12.642 Tj -0 -19.6364 Td -(4062 ) 3.01 Tj -0 -20.9455 Td -(4063 // Inode table. The inode table is an in-memory cache of the) 39.732 Tj -0 -22.2545 Td -(4064 // on-disk inode structures. If an inode in the table has a non-zero) 44.548 Tj -0 -23.5636 Td -(4065 // reference count, then some open files refer to it and it must stay) 44.548 Tj -0 -24.8727 Td -(4066 // in memory. If an inode has a zero reference count, it is only in) 43.946 Tj -0 -26.1818 Td -(4067 // memory as a cache in hopes of being used again \(avoiding a disk read\).) 46.956 Tj -0 -27.4909 Td -(4068 // Any inode with reference count zero can be evicted from the table.) 44.548 Tj -0 -28.8 Td -(4069 //) 4.214 Tj -0 -30.1091 Td -(4070 // In addition to having a reference count, inodes can be marked busy) 44.548 Tj -0 -31.4182 Td -(4071 // \(just like bufs\), meaning that some code has logically locked the) 43.946 Tj -0 -32.7273 Td -(4072 // inode, and others are not allowed to look at it.) 33.712 Tj -0 -34.0364 Td -(4073 // This locking can last for a long) 24.08 Tj -0 -35.3454 Td -(4074 // time \(for example, if the inode is busy during a disk access\),) 42.14 Tj -0 -36.6545 Td -(4075 // so we don't use spin locks. Instead, if a process wants to use) 42.742 Tj -0 -37.9636 Td -(4076 // a particular inode, it must sleep\(ip\) to wait for it to be not busy.) 45.752 Tj -0 -39.2727 Td -(4077 // See iget below.) 13.846 Tj -0 -40.5818 Td -(4078 struct inode inode[NINODE];) 19.264 Tj -0 -41.8909 Td -(4079 struct spinlock inode_table_lock;) 22.876 Tj -0 -43.2 Td -(4080 ) 3.01 Tj -0 -44.5091 Td -(4081 uint rootdev = 1;) 13.244 Tj -0 -45.8182 Td -(4082 ) 3.01 Tj -0 -47.1272 Td -(4083 void) 5.418 Tj -0 -48.4363 Td -(4084 iinit\(void\)) 9.632 Tj -0 -49.7454 Td -(4085 {) 3.612 Tj -0 -51.0545 Td -(4086 initlock\(&inode_table_lock, "inode_table"\);) 30.1 Tj -0 -52.3636 Td -(4087 }) 3.612 Tj -0 -53.6727 Td -(4088 ) 3.01 Tj -0 -54.9818 Td -(4089 ) 3.01 Tj -0 -56.2909 Td -(4090 ) 3.01 Tj -0 -57.6 Td -(4091 ) 3.01 Tj -0 -58.9091 Td -(4092 ) 3.01 Tj -0 -60.2181 Td -(4093 ) 3.01 Tj -0 -61.5272 Td -(4094 ) 3.01 Tj -0 -62.8363 Td -(4095 ) 3.01 Tj -0 -64.1454 Td -(4096 ) 3.01 Tj -0 -65.4545 Td -(4097 ) 3.01 Tj -0 -66.7636 Td -(4098 ) 3.01 Tj -0 -68.0727 Td -(4099 ) 3.01 Tj -0 -72 Td -(Sheet 40) 4.816 Tj +/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 @@ -13828,7 +14771,10 @@ pdfEndPage %%Page: 48 48 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -13836,241 +14782,255 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 2) 21.07 Tj -0 -3.92728 Td -(4100 // Allocate a disk block.) 18.06 Tj -0 -5.23637 Td -(4101 static uint) 9.632 Tj -0 -6.54546 Td -(4102 balloc\(uint dev\)) 12.642 Tj -0 -7.85455 Td -(4103 {) 3.612 Tj -0 -9.16364 Td -(4104 int b;) 7.826 Tj -0 -10.4727 Td -(4105 struct buf *bp;) 13.244 Tj -0 -11.7818 Td -(4106 struct superblock *sb;) 17.458 Tj -0 -13.0909 Td -(4107 int bi = 0;) 10.836 Tj -0 -14.4 Td -(4108 int size;) 9.632 Tj -0 -15.7091 Td -(4109 int ninodes;) 11.438 Tj -0 -17.0182 Td -(4110 uchar m;) 9.03 Tj -0 -18.3273 Td -(4111 ) 3.01 Tj -0 -19.6364 Td -(4112 bp = bread\(dev, 1\);) 15.652 Tj -0 -20.9455 Td -(4113 sb = \(struct superblock*\) bp->data;) 25.284 Tj -0 -22.2545 Td -(4114 size = sb->size;) 13.846 Tj -0 -23.5636 Td -(4115 ninodes = sb->ninodes;) 17.458 Tj -0 -24.8727 Td -(4116 ) 3.01 Tj -0 -26.1818 Td -(4117 for\(b = 0; b < size; b++\) {) 20.468 Tj -0 -27.4909 Td -(4118 if\(b % BPB == 0\) {) 16.254 Tj -0 -28.8 Td -(4119 brelse\(bp\);) 13.244 Tj -0 -30.1091 Td -(4120 bp = bread\(dev, BBLOCK\(b, ninodes\)\);) 28.294 Tj -0 -31.4182 Td -(4121 }) 6.02 Tj -0 -32.7273 Td -(4122 bi = b % BPB;) 13.244 Tj -0 -34.0364 Td -(4123 m = 0x1 << \(bi % 8\);) 17.458 Tj -0 -35.3454 Td -(4124 if\(\(bp->data[bi/8] & m\) == 0\) { // is block free?) 35.518 Tj -0 -36.6545 Td -(4125 break;) 10.234 Tj -0 -37.9636 Td -(4126 }) 6.02 Tj -0 -39.2727 Td -(4127 }) 4.816 Tj -0 -40.5818 Td -(4128 if\(b >= size\)) 12.04 Tj -0 -41.8909 Td -(4129 panic\("balloc: out of blocks"\);) 24.08 Tj -0 -43.2 Td -(4130 ) 3.01 Tj -0 -44.5091 Td -(4131 bp->data[bi/8] |= 0x1 << \(bi % 8\);) 24.682 Tj -0 -45.8182 Td -(4132 bwrite\(bp, BBLOCK\(b, ninodes\)\); // mark it allocated on disk) 40.936 Tj -0 -47.1272 Td -(4133 brelse\(bp\);) 10.836 Tj -0 -48.4363 Td -(4134 return b;) 9.632 Tj -0 -49.7454 Td -(4135 }) 3.612 Tj -0 -51.0545 Td -(4136 ) 3.01 Tj -0 -52.3636 Td -(4137 ) 3.01 Tj -0 -53.6727 Td -(4138 ) 3.01 Tj -0 -54.9818 Td -(4139 ) 3.01 Tj -0 -56.2909 Td -(4140 ) 3.01 Tj -0 -57.6 Td -(4141 ) 3.01 Tj -0 -58.9091 Td -(4142 ) 3.01 Tj -0 -60.2181 Td -(4143 ) 3.01 Tj -0 -61.5272 Td -(4144 ) 3.01 Tj -0 -62.8363 Td -(4145 ) 3.01 Tj -0 -64.1454 Td -(4146 ) 3.01 Tj -0 -65.4545 Td -(4147 ) 3.01 Tj -0 -66.7636 Td -(4148 ) 3.01 Tj -0 -68.0727 Td -(4149 ) 3.01 Tj -0 -72 Td -(Sheet 41) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 3) 21.07 Tj -0 -3.92728 Td -(4150 // Free a disk block.) 15.652 Tj -0 -5.23637 Td -(4151 static void) 9.632 Tj -0 -6.54546 Td -(4152 bfree\(int dev, uint b\)) 16.254 Tj -0 -7.85455 Td -(4153 {) 3.612 Tj -0 -9.16364 Td -(4154 struct buf *bp;) 13.244 Tj -0 -10.4727 Td -(4155 struct superblock *sb;) 17.458 Tj -0 -11.7818 Td -(4156 int bi;) 8.428 Tj -0 -13.0909 Td -(4157 int ninodes;) 11.438 Tj -0 -14.4 Td -(4158 uchar m;) 9.03 Tj -0 -15.7091 Td -(4159 ) 3.01 Tj -0 -17.0182 Td -(4160 bp = bread\(dev, 1\);) 15.652 Tj -0 -18.3273 Td -(4161 sb = \(struct superblock*\) bp->data;) 25.284 Tj -0 -19.6364 Td -(4162 ninodes = sb->ninodes;) 17.458 Tj -0 -20.9455 Td -(4163 brelse\(bp\);) 10.836 Tj -0 -22.2545 Td -(4164 ) 3.01 Tj -0 -23.5636 Td -(4165 bp = bread\(dev, b\);) 15.652 Tj -0 -24.8727 Td -(4166 memset\(bp->data, 0, BSIZE\);) 20.468 Tj -0 -26.1818 Td -(4167 bwrite\(bp, b\);) 12.642 Tj -0 -27.4909 Td -(4168 brelse\(bp\);) 10.836 Tj -0 -28.8 Td -(4169 ) 3.01 Tj -0 -30.1091 Td -(4170 bp = bread\(dev, BBLOCK\(b, ninodes\)\);) 25.886 Tj -0 -31.4182 Td -(4171 bi = b % BPB;) 12.04 Tj -0 -32.7273 Td -(4172 m = ~\(0x1 << \(bi %8\)\);) 17.458 Tj -0 -34.0364 Td -(4173 bp->data[bi/8] &= m;) 16.254 Tj -0 -35.3454 Td -(4174 bwrite\(bp, BBLOCK\(b, ninodes\)\); // mark it free on disk) 37.926 Tj -0 -36.6545 Td -(4175 brelse\(bp\);) 10.836 Tj -0 -37.9636 Td -(4176 }) 3.612 Tj -0 -39.2727 Td -(4177 ) 3.01 Tj -0 -40.5818 Td -(4178 // Find the inode with number inum on device dev) 31.906 Tj -0 -41.8909 Td -(4179 // and return an in-memory copy. Loads the inode) 32.508 Tj -0 -43.2 Td -(4180 // from disk into the in-core table if necessary.) 32.508 Tj -0 -44.5091 Td -(4181 // The returned inode has busy set and has its ref count incremented.) 44.548 Tj -0 -45.8182 Td -(4182 // Caller must iput the return value when done with it.) 36.12 Tj -0 -47.1272 Td -(4183 struct inode*) 10.836 Tj -0 -48.4363 Td -(4184 iget\(uint dev, uint inum\)) 18.06 Tj -0 -49.7454 Td -(4185 {) 3.612 Tj -0 -51.0545 Td -(4186 struct inode *ip, *nip;) 18.06 Tj -0 -52.3636 Td -(4187 struct dinode *dip;) 15.652 Tj -0 -53.6727 Td -(4188 struct buf *bp;) 13.244 Tj -0 -54.9818 Td -(4189 ) 3.01 Tj -0 -56.2909 Td -(4190 acquire\(&inode_table_lock\);) 20.468 Tj -0 -57.6 Td -(4191 ) 3.01 Tj -0 -58.9091 Td -(4192 loop:) 6.622 Tj -0 -60.2181 Td -(4193 nip = 0;) 9.03 Tj -0 -61.5272 Td -(4194 for\(ip = &inode[0]; ip < &inode[NINODE]; ip++\){) 32.508 Tj -0 -62.8363 Td -(4195 if\(ip->ref > 0 && ip->dev == dev && ip->inum == inum\){) 37.926 Tj -0 -64.1454 Td -(4196 if\(ip->busy\){) 14.448 Tj -0 -65.4545 Td -(4197 sleep\(ip, &inode_table_lock\);) 25.284 Tj -0 -66.7636 Td -(4198 // Since we droped inode_table_lock, ip might have been reused) 45.15 Tj -0 -68.0727 Td -(4199 // for some other inode entirely. Must start the scan over,) 43.946 Tj -0 -72 Td -(Sheet 41) 4.816 Tj +/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 @@ -14082,6 +15042,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -14089,241 +15052,256 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 4) 21.07 Tj -0 -3.92728 Td -(4200 // and hopefully this time we will find the inode we want) 42.14 Tj -0 -5.23637 Td -(4201 // and it will not be busy.) 24.08 Tj -0 -6.54546 Td -(4202 goto loop;) 13.846 Tj -0 -7.85455 Td -(4203 }) 7.224 Tj -0 -9.16364 Td -(4204 ip->ref++;) 12.642 Tj -0 -10.4727 Td -(4205 ip->busy = 1;) 14.448 Tj -0 -11.7818 Td -(4206 release\(&inode_table_lock\);) 22.876 Tj -0 -13.0909 Td -(4207 return ip;) 12.642 Tj -0 -14.4 Td -(4208 }) 6.02 Tj -0 -15.7091 Td -(4209 if\(nip == 0 && ip->ref == 0\)) 22.274 Tj -0 -17.0182 Td -(4210 nip = ip;) 12.04 Tj -0 -18.3273 Td -(4211 }) 4.816 Tj -0 -19.6364 Td -(4212 ) 3.01 Tj -0 -20.9455 Td -(4213 if\(nip == 0\)) 11.438 Tj -0 -22.2545 Td -(4214 panic\("out of inodes"\);) 19.264 Tj -0 -23.5636 Td -(4215 ) 3.01 Tj -0 -24.8727 Td -(4216 nip->dev = dev;) 13.244 Tj -0 -26.1818 Td -(4217 nip->inum = inum;) 14.448 Tj -0 -27.4909 Td -(4218 nip->ref = 1;) 12.04 Tj -0 -28.8 Td -(4219 nip->busy = 1;) 12.642 Tj -0 -30.1091 Td -(4220 ) 3.01 Tj -0 -31.4182 Td -(4221 release\(&inode_table_lock\);) 20.468 Tj -0 -32.7273 Td -(4222 ) 3.01 Tj -0 -34.0364 Td -(4223 bp = bread\(dev, IBLOCK\(inum\)\);) 22.274 Tj -0 -35.3454 Td -(4224 dip = &\(\(struct dinode*\)\(bp->data\)\)[inum % IPB];) 33.11 Tj -0 -36.6545 Td -(4225 nip->type = dip->type;) 17.458 Tj -0 -37.9636 Td -(4226 nip->major = dip->major;) 18.662 Tj -0 -39.2727 Td -(4227 nip->minor = dip->minor;) 18.662 Tj -0 -40.5818 Td -(4228 nip->nlink = dip->nlink;) 18.662 Tj -0 -41.8909 Td -(4229 nip->size = dip->size;) 17.458 Tj -0 -43.2 Td -(4230 memmove\(nip->addrs, dip->addrs, sizeof\(nip->addrs\)\);) 35.518 Tj -0 -44.5091 Td -(4231 brelse\(bp\);) 10.836 Tj -0 -45.8182 Td -(4232 ) 3.01 Tj -0 -47.1272 Td -(4233 return nip;) 10.836 Tj -0 -48.4363 Td -(4234 }) 3.612 Tj -0 -49.7454 Td -(4235 ) 3.01 Tj -0 -51.0545 Td -(4236 ) 3.01 Tj -0 -52.3636 Td -(4237 ) 3.01 Tj -0 -53.6727 Td -(4238 ) 3.01 Tj -0 -54.9818 Td -(4239 ) 3.01 Tj -0 -56.2909 Td -(4240 ) 3.01 Tj -0 -57.6 Td -(4241 ) 3.01 Tj -0 -58.9091 Td -(4242 ) 3.01 Tj -0 -60.2181 Td -(4243 ) 3.01 Tj -0 -61.5272 Td -(4244 ) 3.01 Tj -0 -62.8363 Td -(4245 ) 3.01 Tj -0 -64.1454 Td -(4246 ) 3.01 Tj -0 -65.4545 Td -(4247 ) 3.01 Tj -0 -66.7636 Td -(4248 ) 3.01 Tj -0 -68.0727 Td -(4249 ) 3.01 Tj -0 -72 Td -(Sheet 42) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 5) 21.07 Tj -0 -3.92728 Td -(4250 // Copy inode in memory, which has changed, to disk.) 34.314 Tj -0 -5.23637 Td -(4251 // Caller must have locked ip.) 21.07 Tj -0 -6.54546 Td -(4252 void) 5.418 Tj -0 -7.85455 Td -(4253 iupdate\(struct inode *ip\)) 18.06 Tj -0 -9.16364 Td -(4254 {) 3.612 Tj -0 -10.4727 Td -(4255 struct buf *bp;) 13.244 Tj -0 -11.7818 Td -(4256 struct dinode *dip;) 15.652 Tj -0 -13.0909 Td -(4257 ) 3.01 Tj -0 -14.4 Td -(4258 bp = bread\(ip->dev, IBLOCK\(ip->inum\)\);) 27.09 Tj -0 -15.7091 Td -(4259 dip = &\(\(struct dinode*\)\(bp->data\)\)[ip->inum % IPB];) 35.518 Tj -0 -17.0182 Td -(4260 dip->type = ip->type;) 16.856 Tj -0 -18.3273 Td -(4261 dip->major = ip->major;) 18.06 Tj -0 -19.6364 Td -(4262 dip->minor = ip->minor;) 18.06 Tj -0 -20.9455 Td -(4263 dip->nlink = ip->nlink;) 18.06 Tj -0 -22.2545 Td -(4264 dip->size = ip->size;) 16.856 Tj -0 -23.5636 Td -(4265 memmove\(dip->addrs, ip->addrs, sizeof\(ip->addrs\)\);) 34.314 Tj -0 -24.8727 Td -(4266 bwrite\(bp, IBLOCK\(ip->inum\)\); // mark it allocated on the disk) 42.742 Tj -0 -26.1818 Td -(4267 brelse\(bp\);) 10.836 Tj -0 -27.4909 Td -(4268 }) 3.612 Tj -0 -28.8 Td -(4269 ) 3.01 Tj -0 -30.1091 Td -(4270 // Allocate a new inode with the given type) 28.896 Tj -0 -31.4182 Td -(4271 // from the file system on device dev.) 25.886 Tj -0 -32.7273 Td -(4272 struct inode*) 10.836 Tj -0 -34.0364 Td -(4273 ialloc\(uint dev, short type\)) 19.866 Tj -0 -35.3454 Td -(4274 {) 3.612 Tj -0 -36.6545 Td -(4275 struct inode *ip;) 14.448 Tj -0 -37.9636 Td -(4276 struct dinode *dip = 0;) 18.06 Tj -0 -39.2727 Td -(4277 struct superblock *sb;) 17.458 Tj -0 -40.5818 Td -(4278 int ninodes;) 11.438 Tj -0 -41.8909 Td -(4279 int inum;) 9.632 Tj -0 -43.2 Td -(4280 struct buf *bp;) 13.244 Tj -0 -44.5091 Td -(4281 ) 3.01 Tj -0 -45.8182 Td -(4282 bp = bread\(dev, 1\);) 15.652 Tj -0 -47.1272 Td -(4283 sb = \(struct superblock*\) bp->data;) 25.284 Tj -0 -48.4363 Td -(4284 ninodes = sb->ninodes;) 17.458 Tj -0 -49.7454 Td -(4285 brelse\(bp\);) 10.836 Tj -0 -51.0545 Td -(4286 ) 3.01 Tj -0 -52.3636 Td -(4287 for\(inum = 1; inum < ninodes; inum++\) { // loop over inode blocks) 43.946 Tj -0 -53.6727 Td -(4288 bp = bread\(dev, IBLOCK\(inum\)\);) 23.478 Tj -0 -54.9818 Td -(4289 dip = &\(\(struct dinode*\)\(bp->data\)\)[inum % IPB];) 34.314 Tj -0 -56.2909 Td -(4290 if\(dip->type == 0\) { // a free inode) 27.692 Tj -0 -57.6 Td -(4291 break;) 10.234 Tj -0 -58.9091 Td -(4292 }) 6.02 Tj -0 -60.2181 Td -(4293 brelse\(bp\);) 12.04 Tj -0 -61.5272 Td -(4294 }) 4.816 Tj -0 -62.8363 Td -(4295 ) 3.01 Tj -0 -64.1454 Td -(4296 if\(inum >= ninodes\)) 15.652 Tj -0 -65.4545 Td -(4297 panic\("ialloc: no inodes left"\);) 24.682 Tj -0 -66.7636 Td -(4298 ) 3.01 Tj -0 -68.0727 Td -(4299 ) 3.01 Tj -0 -72 Td -(Sheet 42) 4.816 Tj +/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 @@ -14334,7 +15312,10 @@ pdfEndPage %%Page: 50 50 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -14342,241 +15323,259 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 6) 21.07 Tj -0 -3.92728 Td -(4300 memset\(dip, 0, sizeof\(*dip\)\);) 21.672 Tj -0 -5.23637 Td -(4301 dip->type = type;) 14.448 Tj -0 -6.54546 Td -(4302 bwrite\(bp, IBLOCK\(inum\)\); // mark it allocated on the disk) 40.334 Tj -0 -7.85455 Td -(4303 brelse\(bp\);) 10.836 Tj -0 -9.16364 Td -(4304 ip = iget\(dev, inum\);) 16.856 Tj -0 -10.4727 Td -(4305 return ip;) 10.234 Tj -0 -11.7818 Td -(4306 }) 3.612 Tj -0 -13.0909 Td -(4307 ) 3.01 Tj -0 -14.4 Td -(4308 // Free the given inode from its file system.) 30.1 Tj -0 -15.7091 Td -(4309 static void) 9.632 Tj -0 -17.0182 Td -(4310 ifree\(struct inode *ip\)) 16.856 Tj -0 -18.3273 Td -(4311 {) 3.612 Tj -0 -19.6364 Td -(4312 ip->type = 0;) 12.04 Tj -0 -20.9455 Td -(4313 iupdate\(ip\);) 11.438 Tj -0 -22.2545 Td -(4314 }) 3.612 Tj -0 -23.5636 Td -(4315 ) 3.01 Tj -0 -24.8727 Td -(4316 // Lock the given inode \(wait for it to be not busy,) 34.314 Tj -0 -26.1818 Td -(4317 // and then ip->busy\).) 16.254 Tj -0 -27.4909 Td -(4318 // Caller must already hold a reference to ip.) 30.702 Tj -0 -28.8 Td -(4319 // Otherwise, if all the references to ip go away,) 33.11 Tj -0 -30.1091 Td -(4320 // it might be reused underfoot.) 22.274 Tj -0 -31.4182 Td -(4321 void) 5.418 Tj -0 -32.7273 Td -(4322 ilock\(struct inode *ip\)) 16.856 Tj -0 -34.0364 Td -(4323 {) 3.612 Tj -0 -35.3454 Td -(4324 if\(ip->ref < 1\)) 13.244 Tj -0 -36.6545 Td -(4325 panic\("ilock"\);) 14.448 Tj -0 -37.9636 Td -(4326 ) 3.01 Tj -0 -39.2727 Td -(4327 acquire\(&inode_table_lock\);) 20.468 Tj -0 -40.5818 Td -(4328 ) 3.01 Tj -0 -41.8909 Td -(4329 while\(ip->busy\)) 13.244 Tj -0 -43.2 Td -(4330 sleep\(ip, &inode_table_lock\);) 22.876 Tj -0 -44.5091 Td -(4331 ip->busy = 1;) 12.04 Tj -0 -45.8182 Td -(4332 ) 3.01 Tj -0 -47.1272 Td -(4333 release\(&inode_table_lock\);) 20.468 Tj -0 -48.4363 Td -(4334 }) 3.612 Tj -0 -49.7454 Td -(4335 ) 3.01 Tj -0 -51.0545 Td -(4336 ) 3.01 Tj -0 -52.3636 Td -(4337 ) 3.01 Tj -0 -53.6727 Td -(4338 ) 3.01 Tj -0 -54.9818 Td -(4339 ) 3.01 Tj -0 -56.2909 Td -(4340 ) 3.01 Tj -0 -57.6 Td -(4341 ) 3.01 Tj -0 -58.9091 Td -(4342 ) 3.01 Tj -0 -60.2181 Td -(4343 ) 3.01 Tj -0 -61.5272 Td -(4344 ) 3.01 Tj -0 -62.8363 Td -(4345 ) 3.01 Tj -0 -64.1454 Td -(4346 ) 3.01 Tj -0 -65.4545 Td -(4347 ) 3.01 Tj -0 -66.7636 Td -(4348 ) 3.01 Tj -0 -68.0727 Td -(4349 ) 3.01 Tj -0 -72 Td -(Sheet 43) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 7) 21.07 Tj -0 -3.92728 Td -(4350 // Caller holds reference to ip and has locked it.) 33.11 Tj -0 -5.23637 Td -(4351 // Caller no longer needs to examine / change it.) 32.508 Tj -0 -6.54546 Td -(4352 // Unlock it, but keep the reference.) 25.284 Tj -0 -7.85455 Td -(4353 void) 5.418 Tj -0 -9.16364 Td -(4354 iunlock\(struct inode *ip\)) 18.06 Tj -0 -10.4727 Td -(4355 {) 3.612 Tj -0 -11.7818 Td -(4356 if\(ip->busy != 1 || ip->ref < 1\)) 23.478 Tj -0 -13.0909 Td -(4357 panic\("iunlock"\);) 15.652 Tj -0 -14.4 Td -(4358 ) 3.01 Tj -0 -15.7091 Td -(4359 acquire\(&inode_table_lock\);) 20.468 Tj -0 -17.0182 Td -(4360 ) 3.01 Tj -0 -18.3273 Td -(4361 ip->busy = 0;) 12.04 Tj -0 -19.6364 Td -(4362 wakeup\(ip\);) 10.836 Tj -0 -20.9455 Td -(4363 ) 3.01 Tj -0 -22.2545 Td -(4364 release\(&inode_table_lock\);) 20.468 Tj -0 -23.5636 Td -(4365 }) 3.612 Tj -0 -24.8727 Td -(4366 ) 3.01 Tj -0 -26.1818 Td -(4367 // Return the disk block address of the nth block in inode ip.) 40.334 Tj -0 -27.4909 Td -(4368 uint) 5.418 Tj -0 -28.8 Td -(4369 bmap\(struct inode *ip, uint bn\)) 21.672 Tj -0 -30.1091 Td -(4370 {) 3.612 Tj -0 -31.4182 Td -(4371 unsigned x;) 10.836 Tj -0 -32.7273 Td -(4372 uint *a;) 9.03 Tj -0 -34.0364 Td -(4373 struct buf *inbp;) 14.448 Tj -0 -35.3454 Td -(4374 ) 3.01 Tj -0 -36.6545 Td -(4375 if\(bn >= MAXFILE\)) 14.448 Tj -0 -37.9636 Td -(4376 panic\("bmap 1"\);) 15.05 Tj -0 -39.2727 Td -(4377 if\(bn < NDIRECT\) {) 15.05 Tj -0 -40.5818 Td -(4378 x = ip->addrs[bn];) 16.254 Tj -0 -41.8909 Td -(4379 if\(x == 0\)) 11.438 Tj -0 -43.2 Td -(4380 panic\("bmap 2"\);) 16.254 Tj -0 -44.5091 Td -(4381 } else {) 9.03 Tj -0 -45.8182 Td -(4382 if\(ip->addrs[INDIRECT] == 0\)) 22.274 Tj -0 -47.1272 Td -(4383 panic\("bmap 3"\);) 16.254 Tj -0 -48.4363 Td -(4384 inbp = bread\(ip->dev, ip->addrs[INDIRECT]\);) 31.304 Tj -0 -49.7454 Td -(4385 a = \(uint*\) inbp->data;) 19.264 Tj -0 -51.0545 Td -(4386 x = a[bn - NDIRECT];) 17.458 Tj -0 -52.3636 Td -(4387 brelse\(inbp\);) 13.244 Tj -0 -53.6727 Td -(4388 if\(x == 0\)) 11.438 Tj -0 -54.9818 Td -(4389 panic\("bmap 4"\);) 16.254 Tj -0 -56.2909 Td -(4390 }) 4.816 Tj -0 -57.6 Td -(4391 return x;) 9.632 Tj -0 -58.9091 Td -(4392 }) 3.612 Tj -0 -60.2181 Td -(4393 ) 3.01 Tj -0 -61.5272 Td -(4394 ) 3.01 Tj -0 -62.8363 Td -(4395 ) 3.01 Tj -0 -64.1454 Td -(4396 ) 3.01 Tj -0 -65.4545 Td -(4397 ) 3.01 Tj -0 -66.7636 Td -(4398 ) 3.01 Tj -0 -68.0727 Td -(4399 ) 3.01 Tj -0 -72 Td -(Sheet 43) 4.816 Tj +/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 @@ -14588,6 +15587,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -14595,241 +15597,254 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 8) 21.07 Tj -0 -3.92728 Td -(4400 // Truncate the inode ip, discarding all its data blocks.) 37.324 Tj -0 -5.23637 Td -(4401 void) 5.418 Tj -0 -6.54546 Td -(4402 itrunc\(struct inode *ip\)) 17.458 Tj -0 -7.85455 Td -(4403 {) 3.612 Tj -0 -9.16364 Td -(4404 int i, j;) 9.632 Tj -0 -10.4727 Td -(4405 struct buf *inbp;) 14.448 Tj -0 -11.7818 Td -(4406 ) 3.01 Tj -0 -13.0909 Td -(4407 for\(i = 0; i < NADDRS; i++\) {) 21.672 Tj -0 -14.4 Td -(4408 if\(ip->addrs[i] != 0\) {) 19.264 Tj -0 -15.7091 Td -(4409 if\(i == INDIRECT\) {) 18.06 Tj -0 -17.0182 Td -(4410 inbp = bread\(ip->dev, ip->addrs[INDIRECT]\);) 33.712 Tj -0 -18.3273 Td -(4411 uint *a = \(uint*\) inbp->data;) 25.284 Tj -0 -19.6364 Td -(4412 for\(j = 0; j < NINDIRECT; j++\) {) 27.09 Tj -0 -20.9455 Td -(4413 if\(a[j] != 0\) {) 18.06 Tj -0 -22.2545 Td -(4414 bfree\(ip->dev, a[j]\);) 22.876 Tj -0 -23.5636 Td -(4415 a[j] = 0;) 15.652 Tj -0 -24.8727 Td -(4416 }) 9.632 Tj -0 -26.1818 Td -(4417 }) 8.428 Tj -0 -27.4909 Td -(4418 brelse\(inbp\);) 15.652 Tj -0 -28.8 Td -(4419 }) 7.224 Tj -0 -30.1091 Td -(4420 bfree\(ip->dev, ip->addrs[i]\);) 24.08 Tj -0 -31.4182 Td -(4421 ip->addrs[i] = 0;) 16.856 Tj -0 -32.7273 Td -(4422 }) 6.02 Tj -0 -34.0364 Td -(4423 }) 4.816 Tj -0 -35.3454 Td -(4424 ip->size = 0;) 12.04 Tj -0 -36.6545 Td -(4425 iupdate\(ip\);) 11.438 Tj -0 -37.9636 Td -(4426 }) 3.612 Tj -0 -39.2727 Td -(4427 ) 3.01 Tj -0 -40.5818 Td -(4428 // Caller holds reference to ip and has locked it,) 33.11 Tj -0 -41.8909 Td -(4429 // possibly editing it.) 16.856 Tj -0 -43.2 Td -(4430 // Release lock and drop the reference.) 26.488 Tj -0 -44.5091 Td -(4431 void) 5.418 Tj -0 -45.8182 Td -(4432 iput\(struct inode *ip\)) 16.254 Tj -0 -47.1272 Td -(4433 {) 3.612 Tj -0 -48.4363 Td -(4434 if\(ip->ref < 1 || ip->busy != 1\)) 23.478 Tj -0 -49.7454 Td -(4435 panic\("iput"\);) 13.846 Tj -0 -51.0545 Td -(4436 ) 3.01 Tj -0 -52.3636 Td -(4437 if\(\(ip->ref == 1\) && \(ip->nlink == 0\)\) {) 28.294 Tj -0 -53.6727 Td -(4438 itrunc\(ip\);) 12.04 Tj -0 -54.9818 Td -(4439 ifree\(ip\);) 11.438 Tj -0 -56.2909 Td -(4440 }) 4.816 Tj -0 -57.6 Td -(4441 ) 3.01 Tj -0 -58.9091 Td -(4442 acquire\(&inode_table_lock\);) 20.468 Tj -0 -60.2181 Td -(4443 ) 3.01 Tj -0 -61.5272 Td -(4444 ip->ref -= 1;) 12.04 Tj -0 -62.8363 Td -(4445 ip->busy = 0;) 12.04 Tj -0 -64.1454 Td -(4446 wakeup\(ip\);) 10.836 Tj -0 -65.4545 Td -(4447 ) 3.01 Tj -0 -66.7636 Td -(4448 release\(&inode_table_lock\);) 20.468 Tj -0 -68.0727 Td -(4449 }) 3.612 Tj -0 -72 Td -(Sheet 44) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 9) 21.07 Tj -0 -3.92728 Td -(4450 // Caller holds reference to ip but not lock.) 30.1 Tj -0 -5.23637 Td -(4451 // Drop reference.) 13.846 Tj -0 -6.54546 Td -(4452 void) 5.418 Tj -0 -7.85455 Td -(4453 idecref\(struct inode *ip\)) 18.06 Tj -0 -9.16364 Td -(4454 {) 3.612 Tj -0 -10.4727 Td -(4455 ilock\(ip\);) 10.234 Tj -0 -11.7818 Td -(4456 iput\(ip\);) 9.632 Tj -0 -13.0909 Td -(4457 }) 3.612 Tj -0 -14.4 Td -(4458 ) 3.01 Tj -0 -15.7091 Td -(4459 // Increment reference count for ip.) 24.682 Tj -0 -17.0182 Td -(4460 void) 5.418 Tj -0 -18.3273 Td -(4461 iincref\(struct inode *ip\)) 18.06 Tj -0 -19.6364 Td -(4462 {) 3.612 Tj -0 -20.9455 Td -(4463 ilock\(ip\);) 10.234 Tj -0 -22.2545 Td -(4464 ip->ref++;) 10.234 Tj -0 -23.5636 Td -(4465 iunlock\(ip\);) 11.438 Tj -0 -24.8727 Td -(4466 }) 3.612 Tj -0 -26.1818 Td -(4467 ) 3.01 Tj -0 -27.4909 Td -(4468 // Copy stat information from inode.) 24.682 Tj -0 -28.8 Td -(4469 void) 5.418 Tj -0 -30.1091 Td -(4470 stati\(struct inode *ip, struct stat *st\)) 27.09 Tj -0 -31.4182 Td -(4471 {) 3.612 Tj -0 -32.7273 Td -(4472 st->dev = ip->dev;) 15.05 Tj -0 -34.0364 Td -(4473 st->ino = ip->inum;) 15.652 Tj -0 -35.3454 Td -(4474 st->type = ip->type;) 16.254 Tj -0 -36.6545 Td -(4475 st->nlink = ip->nlink;) 17.458 Tj -0 -37.9636 Td -(4476 st->size = ip->size;) 16.254 Tj -0 -39.2727 Td -(4477 }) 3.612 Tj -0 -40.5818 Td -(4478 ) 3.01 Tj -0 -41.8909 Td -(4479 #define min\(a, b\) \(\(a\) < \(b\) ? \(a\) : \(b\)\)) 27.692 Tj -0 -43.2 Td -(4480 ) 3.01 Tj -0 -44.5091 Td -(4481 // Read data from inode.) 17.458 Tj -0 -45.8182 Td -(4482 int) 4.816 Tj -0 -47.1272 Td -(4483 readi\(struct inode *ip, char *dst, uint off, uint n\)) 34.314 Tj -0 -48.4363 Td -(4484 {) 3.612 Tj -0 -49.7454 Td -(4485 uint target = n, n1;) 16.254 Tj -0 -51.0545 Td -(4486 struct buf *bp;) 13.244 Tj -0 -52.3636 Td -(4487 ) 3.01 Tj -0 -53.6727 Td -(4488 if\(ip->type == T_DEV\) {) 18.06 Tj -0 -54.9818 Td -(4489 if\(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].read\)) 43.946 Tj -0 -56.2909 Td -(4490 return -1;) 12.642 Tj -0 -57.6 Td -(4491 return devsw[ip->major].read\(ip->minor, dst, n\);) 34.314 Tj -0 -58.9091 Td -(4492 }) 4.816 Tj -0 -60.2181 Td -(4493 ) 3.01 Tj -0 -61.5272 Td -(4494 while\(n > 0 && off < ip->size\){) 22.876 Tj -0 -62.8363 Td -(4495 bp = bread\(ip->dev, bmap\(ip, off / BSIZE\)\);) 31.304 Tj -0 -64.1454 Td -(4496 n1 = min\(n, ip->size - off\);) 22.274 Tj -0 -65.4545 Td -(4497 n1 = min\(n1, BSIZE - \(off % BSIZE\)\);) 27.09 Tj -0 -66.7636 Td -(4498 memmove\(dst, bp->data + \(off % BSIZE\), n1\);) 31.304 Tj -0 -68.0727 Td -(4499 n -= n1;) 10.234 Tj -0 -72 Td -(Sheet 44) 4.816 Tj +/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 @@ -14840,7 +15855,10 @@ pdfEndPage %%Page: 52 52 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -14848,241 +15866,255 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 10) 21.672 Tj -0 -3.92728 Td -(4500 off += n1;) 11.438 Tj -0 -5.23637 Td -(4501 dst += n1;) 11.438 Tj -0 -6.54546 Td -(4502 brelse\(bp\);) 12.04 Tj -0 -7.85455 Td -(4503 }) 4.816 Tj -0 -9.16364 Td -(4504 ) 3.01 Tj -0 -10.4727 Td -(4505 return target - n;) 15.05 Tj -0 -11.7818 Td -(4506 }) 3.612 Tj -0 -13.0909 Td -(4507 ) 3.01 Tj -0 -14.4 Td -(4508 // Allocate the nth block in inode ip if necessary.) 33.712 Tj -0 -15.7091 Td -(4509 static int) 9.03 Tj -0 -17.0182 Td -(4510 newblock\(struct inode *ip, uint lbn\)) 24.682 Tj -0 -18.3273 Td -(4511 {) 3.612 Tj -0 -19.6364 Td -(4512 struct buf *inbp;) 14.448 Tj -0 -20.9455 Td -(4513 uint *inaddrs;) 12.642 Tj -0 -22.2545 Td -(4514 uint b;) 8.428 Tj -0 -23.5636 Td -(4515 ) 3.01 Tj -0 -24.8727 Td -(4516 if\(lbn < NDIRECT\) {) 15.652 Tj -0 -26.1818 Td -(4517 if\(ip->addrs[lbn] == 0\) {) 20.468 Tj -0 -27.4909 Td -(4518 b = balloc\(ip->dev\);) 18.662 Tj -0 -28.8 Td -(4519 if\(b <= 0\)) 12.642 Tj -0 -30.1091 Td -(4520 return -1;) 13.846 Tj -0 -31.4182 Td -(4521 ip->addrs[lbn] = b;) 18.06 Tj -0 -32.7273 Td -(4522 }) 6.02 Tj -0 -34.0364 Td -(4523 } else {) 9.03 Tj -0 -35.3454 Td -(4524 if\(ip->addrs[INDIRECT] == 0\) {) 23.478 Tj -0 -36.6545 Td -(4525 b = balloc\(ip->dev\);) 18.662 Tj -0 -37.9636 Td -(4526 if\(b <= 0\)) 12.642 Tj -0 -39.2727 Td -(4527 return -1;) 13.846 Tj -0 -40.5818 Td -(4528 ip->addrs[INDIRECT] = b;) 21.07 Tj -0 -41.8909 Td -(4529 }) 6.02 Tj -0 -43.2 Td -(4530 inbp = bread\(ip->dev, ip->addrs[INDIRECT]\);) 31.304 Tj -0 -44.5091 Td -(4531 inaddrs = \(uint*\) inbp->data;) 22.876 Tj -0 -45.8182 Td -(4532 if\(inaddrs[lbn - NDIRECT] == 0\) {) 25.284 Tj -0 -47.1272 Td -(4533 b = balloc\(ip->dev\);) 18.662 Tj -0 -48.4363 Td -(4534 if\(b <= 0\)) 12.642 Tj -0 -49.7454 Td -(4535 return -1;) 13.846 Tj -0 -51.0545 Td -(4536 inaddrs[lbn - NDIRECT] = b;) 22.876 Tj -0 -52.3636 Td -(4537 bwrite\(inbp, ip->addrs[INDIRECT]\);) 27.09 Tj -0 -53.6727 Td -(4538 }) 6.02 Tj -0 -54.9818 Td -(4539 brelse\(inbp\);) 13.244 Tj -0 -56.2909 Td -(4540 }) 4.816 Tj -0 -57.6 Td -(4541 return 0;) 9.632 Tj -0 -58.9091 Td -(4542 }) 3.612 Tj -0 -60.2181 Td -(4543 ) 3.01 Tj -0 -61.5272 Td -(4544 ) 3.01 Tj -0 -62.8363 Td -(4545 ) 3.01 Tj -0 -64.1454 Td -(4546 ) 3.01 Tj -0 -65.4545 Td -(4547 ) 3.01 Tj -0 -66.7636 Td -(4548 ) 3.01 Tj -0 -68.0727 Td -(4549 ) 3.01 Tj -0 -72 Td -(Sheet 45) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 11) 21.672 Tj -0 -3.92728 Td -(4550 // Write data to inode.) 16.856 Tj -0 -5.23637 Td -(4551 int) 4.816 Tj -0 -6.54546 Td -(4552 writei\(struct inode *ip, char *addr, uint off, uint n\)) 35.518 Tj -0 -7.85455 Td -(4553 {) 3.612 Tj -0 -9.16364 Td -(4554 if\(ip->type == T_DEV\) {) 18.06 Tj -0 -10.4727 Td -(4555 if\(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].write\)) 44.548 Tj -0 -11.7818 Td -(4556 return -1;) 12.642 Tj -0 -13.0909 Td -(4557 return devsw[ip->major].write\(ip->minor, addr, n\);) 35.518 Tj -0 -14.4 Td -(4558 } else if\(ip->type == T_FILE || ip->type == T_DIR\) {) 35.518 Tj -0 -15.7091 Td -(4559 struct buf *bp;) 14.448 Tj -0 -17.0182 Td -(4560 int r = 0;) 11.438 Tj -0 -18.3273 Td -(4561 int m;) 9.03 Tj -0 -19.6364 Td -(4562 int lbn;) 10.234 Tj -0 -20.9455 Td -(4563 while\(r < n\) {) 13.846 Tj -0 -22.2545 Td -(4564 lbn = off / BSIZE;) 17.458 Tj -0 -23.5636 Td -(4565 if\(lbn >= MAXFILE\)) 17.458 Tj -0 -24.8727 Td -(4566 return r;) 13.244 Tj -0 -26.1818 Td -(4567 if\(newblock\(ip, lbn\) < 0\) {) 22.876 Tj -0 -27.4909 Td -(4568 cprintf\("newblock failed\\n"\);) 25.284 Tj -0 -28.8 Td -(4569 return r;) 13.244 Tj -0 -30.1091 Td -(4570 }) 7.224 Tj -0 -31.4182 Td -(4571 m = min\(BSIZE - off % BSIZE, n-r\);) 27.09 Tj -0 -32.7273 Td -(4572 bp = bread\(ip->dev, bmap\(ip, lbn\)\);) 27.692 Tj -0 -34.0364 Td -(4573 memmove\(bp->data + off % BSIZE, addr, m\);) 31.304 Tj -0 -35.3454 Td -(4574 bwrite\(bp, bmap\(ip, lbn\)\);) 22.274 Tj -0 -36.6545 Td -(4575 brelse\(bp\);) 13.244 Tj -0 -37.9636 Td -(4576 r += m;) 10.836 Tj -0 -39.2727 Td -(4577 off += m;) 12.04 Tj -0 -40.5818 Td -(4578 }) 6.02 Tj -0 -41.8909 Td -(4579 if\(r > 0\) {) 12.04 Tj -0 -43.2 Td -(4580 if\(off > ip->size\) {) 18.662 Tj -0 -44.5091 Td -(4581 if\(ip->type == T_DIR\)) 20.468 Tj -0 -45.8182 Td -(4582 ip->size = \(\(off / BSIZE\) + 1\) * BSIZE;) 32.508 Tj -0 -47.1272 Td -(4583 else) 10.234 Tj -0 -48.4363 Td -(4584 ip->size = off;) 18.06 Tj -0 -49.7454 Td -(4585 }) 7.224 Tj -0 -51.0545 Td -(4586 iupdate\(ip\);) 13.846 Tj -0 -52.3636 Td -(4587 }) 6.02 Tj -0 -53.6727 Td -(4588 return r;) 10.836 Tj -0 -54.9818 Td -(4589 } else {) 9.03 Tj -0 -56.2909 Td -(4590 panic\("writei: unknown type"\);) 23.478 Tj -0 -57.6 Td -(4591 return 0;) 10.836 Tj -0 -58.9091 Td -(4592 }) 4.816 Tj -0 -60.2181 Td -(4593 }) 3.612 Tj -0 -61.5272 Td -(4594 ) 3.01 Tj -0 -62.8363 Td -(4595 ) 3.01 Tj -0 -64.1454 Td -(4596 ) 3.01 Tj -0 -65.4545 Td -(4597 ) 3.01 Tj -0 -66.7636 Td -(4598 ) 3.01 Tj -0 -68.0727 Td -(4599 ) 3.01 Tj -0 -72 Td -(Sheet 45) 4.816 Tj +/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 @@ -15094,6 +16126,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -15101,241 +16136,257 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 12) 21.672 Tj -0 -3.92728 Td -(4600 // look up a path name, in one of three modes.) 30.702 Tj -0 -5.23637 Td -(4601 // NAMEI_LOOKUP: return locked target inode.) 29.498 Tj -0 -6.54546 Td -(4602 // NAMEI_CREATE: return locked parent inode.) 29.498 Tj -0 -7.85455 Td -(4603 // return 0 if name does exist.) 22.876 Tj -0 -9.16364 Td -(4604 // *ret_last points to last path component \(i.e. new file name\).) 42.742 Tj -0 -10.4727 Td -(4605 // *ret_ip points to the the name that did exist, if it did.) 40.334 Tj -0 -11.7818 Td -(4606 // *ret_ip and *ret_last may be zero even if return value is zero.) 43.946 Tj -0 -13.0909 Td -(4607 // NAMEI_DELETE: return locked parent inode, offset of dirent in *ret_off.) 47.558 Tj -0 -14.4 Td -(4608 // return 0 if name doesn't exist.) 24.682 Tj -0 -15.7091 Td -(4609 struct inode*) 10.836 Tj -0 -17.0182 Td -(4610 namei\(char *path, int mode, uint *ret_off,) 28.294 Tj -0 -18.3273 Td -(4611 char **ret_last, struct inode **ret_ip\)) 30.1 Tj -0 -19.6364 Td -(4612 {) 3.612 Tj -0 -20.9455 Td -(4613 struct inode *dp;) 14.448 Tj -0 -22.2545 Td -(4614 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -23.5636 Td -(4615 char *cp = path, *cp1;) 17.458 Tj -0 -24.8727 Td -(4616 uint off, dev;) 12.642 Tj -0 -26.1818 Td -(4617 struct buf *bp;) 13.244 Tj -0 -27.4909 Td -(4618 struct dirent *ep;) 15.05 Tj -0 -28.8 Td -(4619 int i, l, atend;) 13.846 Tj -0 -30.1091 Td -(4620 uint ninum;) 10.836 Tj -0 -31.4182 Td -(4621 ) 3.01 Tj -0 -32.7273 Td -(4622 if\(ret_off\)) 10.836 Tj -0 -34.0364 Td -(4623 *ret_off = 0xffffffff;) 18.662 Tj -0 -35.3454 Td -(4624 if\(ret_last\)) 11.438 Tj -0 -36.6545 Td -(4625 *ret_last = 0;) 13.846 Tj -0 -37.9636 Td -(4626 if\(ret_ip\)) 10.234 Tj -0 -39.2727 Td -(4627 *ret_ip = 0;) 12.642 Tj -0 -40.5818 Td -(4628 ) 3.01 Tj -0 -41.8909 Td -(4629 if\(*cp == '/'\)) 12.642 Tj -0 -43.2 Td -(4630 dp = iget\(rootdev, 1\);) 18.662 Tj -0 -44.5091 Td -(4631 else {) 7.826 Tj -0 -45.8182 Td -(4632 dp = p->cwd;) 12.642 Tj -0 -47.1272 Td -(4633 iincref\(dp\);) 12.642 Tj -0 -48.4363 Td -(4634 ilock\(dp\);) 11.438 Tj -0 -49.7454 Td -(4635 }) 4.816 Tj -0 -51.0545 Td -(4636 ) 3.01 Tj -0 -52.3636 Td -(4637 for\(;;\){) 9.03 Tj -0 -53.6727 Td -(4638 while\(*cp == '/'\)) 15.652 Tj -0 -54.9818 Td -(4639 cp++;) 9.632 Tj -0 -56.2909 Td -(4640 ) 3.01 Tj -0 -57.6 Td -(4641 if\(*cp == '\\0'\){) 15.05 Tj -0 -58.9091 Td -(4642 if\(mode == NAMEI_LOOKUP\)) 21.07 Tj -0 -60.2181 Td -(4643 return dp;) 13.846 Tj -0 -61.5272 Td -(4644 if\(mode == NAMEI_CREATE && ret_ip\){) 27.692 Tj -0 -62.8363 Td -(4645 *ret_ip = dp;) 15.652 Tj -0 -64.1454 Td -(4646 return 0;) 13.244 Tj -0 -65.4545 Td -(4647 }) 7.224 Tj -0 -66.7636 Td -(4648 iput\(dp\);) 12.04 Tj -0 -68.0727 Td -(4649 return 0;) 12.04 Tj -0 -72 Td -(Sheet 46) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 13) 21.672 Tj -0 -3.92728 Td -(4650 }) 6.02 Tj -0 -5.23637 Td -(4651 ) 3.01 Tj -0 -6.54546 Td -(4652 if\(dp->type != T_DIR\){) 18.662 Tj -0 -7.85455 Td -(4653 iput\(dp\);) 12.04 Tj -0 -9.16364 Td -(4654 return 0;) 12.04 Tj -0 -10.4727 Td -(4655 }) 6.02 Tj -0 -11.7818 Td -(4656 ) 3.01 Tj -0 -13.0909 Td -(4657 for\(i = 0; cp[i] != 0 && cp[i] != '/'; i++\)) 31.304 Tj -0 -14.4 Td -(4658 ;) 7.224 Tj -0 -15.7091 Td -(4659 l = i;) 9.03 Tj -0 -17.0182 Td -(4660 if\(i > DIRSIZ\)) 13.846 Tj -0 -18.3273 Td -(4661 l = DIRSIZ;) 13.244 Tj -0 -19.6364 Td -(4662 ) 3.01 Tj -0 -20.9455 Td -(4663 for\(off = 0; off < dp->size; off += BSIZE\){) 31.304 Tj -0 -22.2545 Td -(4664 bp = bread\(dp->dev, bmap\(dp, off / BSIZE\)\);) 32.508 Tj -0 -23.5636 Td -(4665 for\(ep = \(struct dirent*\) bp->data;) 27.692 Tj -0 -24.8727 Td -(4666 ep < \(struct dirent*\) \(bp->data + BSIZE\);) 33.712 Tj -0 -26.1818 Td -(4667 ep++\){) 12.642 Tj -0 -27.4909 Td -(4668 if\(ep->inum == 0\)) 18.06 Tj -0 -28.8 Td -(4669 continue;) 14.448 Tj -0 -30.1091 Td -(4670 if\(memcmp\(cp, ep->name, l\) == 0 &&) 28.294 Tj -0 -31.4182 Td -(4671 \(l == DIRSIZ || ep->name[l]== 0\)\){) 30.1 Tj -0 -32.7273 Td -(4672 // entry matches path element) 26.488 Tj -0 -34.0364 Td -(4673 off += \(uchar*\)ep - bp->data;) 26.488 Tj -0 -35.3454 Td -(4674 ninum = ep->inum;) 19.264 Tj -0 -36.6545 Td -(4675 brelse\(bp\);) 15.652 Tj -0 -37.9636 Td -(4676 cp += i;) 13.846 Tj -0 -39.2727 Td -(4677 goto found;) 15.652 Tj -0 -40.5818 Td -(4678 }) 8.428 Tj -0 -41.8909 Td -(4679 }) 7.224 Tj -0 -43.2 Td -(4680 brelse\(bp\);) 13.244 Tj -0 -44.5091 Td -(4681 }) 6.02 Tj -0 -45.8182 Td -(4682 atend = 1;) 11.438 Tj -0 -47.1272 Td -(4683 for\(cp1 = cp; *cp1; cp1++\)) 21.07 Tj -0 -48.4363 Td -(4684 if\(*cp1 == '/'\)) 15.652 Tj -0 -49.7454 Td -(4685 atend = 0;) 13.846 Tj -0 -51.0545 Td -(4686 if\(mode == NAMEI_CREATE && atend\){) 25.886 Tj -0 -52.3636 Td -(4687 if\(*cp == '\\0'\){) 16.254 Tj -0 -53.6727 Td -(4688 iput\(dp\);) 13.244 Tj -0 -54.9818 Td -(4689 return 0;) 13.244 Tj -0 -56.2909 Td -(4690 }) 7.224 Tj -0 -57.6 Td -(4691 *ret_last = cp;) 15.652 Tj -0 -58.9091 Td -(4692 return dp;) 12.642 Tj -0 -60.2181 Td -(4693 }) 6.02 Tj -0 -61.5272 Td -(4694 ) 3.01 Tj -0 -62.8363 Td -(4695 iput\(dp\);) 10.836 Tj -0 -64.1454 Td -(4696 return 0;) 10.836 Tj -0 -65.4545 Td -(4697 ) 3.01 Tj -0 -66.7636 Td -(4698 ) 3.01 Tj -0 -68.0727 Td -(4699 ) 3.01 Tj -0 -72 Td -(Sheet 46) 4.816 Tj +/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 @@ -15346,7 +16397,10 @@ pdfEndPage %%Page: 54 54 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -15354,241 +16408,257 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 14) 21.672 Tj -0 -3.92728 Td -(4700 found:) 7.826 Tj -0 -5.23637 Td -(4701 if\(mode == NAMEI_DELETE && *cp == '\\0'\){) 29.498 Tj -0 -6.54546 Td -(4702 *ret_off = off;) 15.652 Tj -0 -7.85455 Td -(4703 return dp;) 12.642 Tj -0 -9.16364 Td -(4704 }) 6.02 Tj -0 -10.4727 Td -(4705 dev = dp->dev;) 13.846 Tj -0 -11.7818 Td -(4706 iput\(dp\);) 10.836 Tj -0 -13.0909 Td -(4707 dp = iget\(dev, ninum\);) 18.662 Tj -0 -14.4 Td -(4708 if\(dp->type == 0 || dp->nlink < 1\)) 25.886 Tj -0 -15.7091 Td -(4709 panic\("namei"\);) 15.652 Tj -0 -17.0182 Td -(4710 }) 4.816 Tj -0 -18.3273 Td -(4711 }) 3.612 Tj -0 -19.6364 Td -(4712 ) 3.01 Tj -0 -20.9455 Td -(4713 // Write a new directory entry \(name, ino\) into the directory dp.) 42.14 Tj -0 -22.2545 Td -(4714 // Caller must have locked dp.) 21.07 Tj -0 -23.5636 Td -(4715 void) 5.418 Tj -0 -24.8727 Td -(4716 wdir\(struct inode *dp, char *name, uint ino\)) 29.498 Tj -0 -26.1818 Td -(4717 {) 3.612 Tj -0 -27.4909 Td -(4718 uint off;) 9.632 Tj -0 -28.8 Td -(4719 struct dirent de;) 14.448 Tj -0 -30.1091 Td -(4720 int i;) 7.826 Tj -0 -31.4182 Td -(4721 ) 3.01 Tj -0 -32.7273 Td -(4722 for\(off = 0; off < dp->size; off += sizeof\(de\)\){) 33.11 Tj -0 -34.0364 Td -(4723 if\(readi\(dp, \(char*\) &de, off, sizeof\(de\)\) != sizeof\(de\)\)) 39.732 Tj -0 -35.3454 Td -(4724 panic\("wdir read"\);) 18.06 Tj -0 -36.6545 Td -(4725 if\(de.inum == 0\)) 15.05 Tj -0 -37.9636 Td -(4726 break;) 10.234 Tj -0 -39.2727 Td -(4727 }) 4.816 Tj -0 -40.5818 Td -(4728 ) 3.01 Tj -0 -41.8909 Td -(4729 de.inum = ino;) 12.642 Tj -0 -43.2 Td -(4730 for\(i = 0; i < DIRSIZ && name[i]; i++\)) 27.09 Tj -0 -44.5091 Td -(4731 de.name[i] = name[i];) 18.06 Tj -0 -45.8182 Td -(4732 for\( ; i < DIRSIZ; i++\)) 18.06 Tj -0 -47.1272 Td -(4733 de.name[i] = '\\0';) 16.254 Tj -0 -48.4363 Td -(4734 ) 3.01 Tj -0 -49.7454 Td -(4735 if\(writei\(dp, \(char*\) &de, off, sizeof\(de\)\) != sizeof\(de\)\)) 39.13 Tj -0 -51.0545 Td -(4736 panic\("wdir write"\);) 17.458 Tj -0 -52.3636 Td -(4737 }) 3.612 Tj -0 -53.6727 Td -(4738 ) 3.01 Tj -0 -54.9818 Td -(4739 ) 3.01 Tj -0 -56.2909 Td -(4740 ) 3.01 Tj -0 -57.6 Td -(4741 ) 3.01 Tj -0 -58.9091 Td -(4742 ) 3.01 Tj -0 -60.2181 Td -(4743 ) 3.01 Tj -0 -61.5272 Td -(4744 ) 3.01 Tj -0 -62.8363 Td -(4745 ) 3.01 Tj -0 -64.1454 Td -(4746 ) 3.01 Tj -0 -65.4545 Td -(4747 ) 3.01 Tj -0 -66.7636 Td -(4748 ) 3.01 Tj -0 -68.0727 Td -(4749 ) 3.01 Tj -0 -72 Td -(Sheet 47) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 15) 21.672 Tj -0 -3.92728 Td -(4750 // Create the path cp and return its locked inode structure.) 39.13 Tj -0 -5.23637 Td -(4751 // If cp already exists, return 0.) 23.478 Tj -0 -6.54546 Td -(4752 struct inode*) 10.836 Tj -0 -7.85455 Td -(4753 mknod\(char *cp, short type, short major, short minor\)) 34.916 Tj -0 -9.16364 Td -(4754 {) 3.612 Tj -0 -10.4727 Td -(4755 struct inode *ip, *dp;) 17.458 Tj -0 -11.7818 Td -(4756 char *last;) 10.836 Tj -0 -13.0909 Td -(4757 ) 3.01 Tj -0 -14.4 Td -(4758 if\(\(dp = namei\(cp, NAMEI_CREATE, 0, &last, 0\)\) == 0\)) 35.518 Tj -0 -15.7091 Td -(4759 return 0;) 10.836 Tj -0 -17.0182 Td -(4760 ) 3.01 Tj -0 -18.3273 Td -(4761 ip = mknod1\(dp, last, type, major, minor\);) 29.498 Tj -0 -19.6364 Td -(4762 ) 3.01 Tj -0 -20.9455 Td -(4763 iput\(dp\);) 9.632 Tj -0 -22.2545 Td -(4764 ) 3.01 Tj -0 -23.5636 Td -(4765 return ip;) 10.234 Tj -0 -24.8727 Td -(4766 }) 3.612 Tj -0 -26.1818 Td -(4767 ) 3.01 Tj -0 -27.4909 Td -(4768 // Create a new inode named name inside dp) 28.294 Tj -0 -28.8 Td -(4769 // and return its locked inode structure.) 27.692 Tj -0 -30.1091 Td -(4770 // If name already exists, return 0.) 24.682 Tj -0 -31.4182 Td -(4771 struct inode*) 10.836 Tj -0 -32.7273 Td -(4772 mknod1\(struct inode *dp, char *name, short type, short major, short minor\)) 47.558 Tj -0 -34.0364 Td -(4773 {) 3.612 Tj -0 -35.3454 Td -(4774 struct inode *ip;) 14.448 Tj -0 -36.6545 Td -(4775 ) 3.01 Tj -0 -37.9636 Td -(4776 ip = ialloc\(dp->dev, type\);) 20.468 Tj -0 -39.2727 Td -(4777 if\(ip == 0\)) 10.836 Tj -0 -40.5818 Td -(4778 return 0;) 10.836 Tj -0 -41.8909 Td -(4779 ip->major = major;) 15.05 Tj -0 -43.2 Td -(4780 ip->minor = minor;) 15.05 Tj -0 -44.5091 Td -(4781 ip->size = 0;) 12.04 Tj -0 -45.8182 Td -(4782 ip->nlink = 1;) 12.642 Tj -0 -47.1272 Td -(4783 ) 3.01 Tj -0 -48.4363 Td -(4784 iupdate\(ip\); // write new inode to disk) 28.294 Tj -0 -49.7454 Td -(4785 ) 3.01 Tj -0 -51.0545 Td -(4786 wdir\(dp, name, ip->inum\);) 19.264 Tj -0 -52.3636 Td -(4787 ) 3.01 Tj -0 -53.6727 Td -(4788 return ip;) 10.234 Tj -0 -54.9818 Td -(4789 }) 3.612 Tj -0 -56.2909 Td -(4790 ) 3.01 Tj -0 -57.6 Td -(4791 ) 3.01 Tj -0 -58.9091 Td -(4792 ) 3.01 Tj -0 -60.2181 Td -(4793 ) 3.01 Tj -0 -61.5272 Td -(4794 ) 3.01 Tj -0 -62.8363 Td -(4795 ) 3.01 Tj -0 -64.1454 Td -(4796 ) 3.01 Tj -0 -65.4545 Td -(4797 ) 3.01 Tj -0 -66.7636 Td -(4798 ) 3.01 Tj -0 -68.0727 Td -(4799 ) 3.01 Tj -0 -72 Td -(Sheet 47) 4.816 Tj +/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 @@ -15600,6 +16670,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -15607,241 +16680,260 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 16) 21.672 Tj -0 -3.92728 Td -(4800 // Unlink the inode named cp.) 20.468 Tj -0 -5.23637 Td -(4801 int) 4.816 Tj -0 -6.54546 Td -(4802 unlink\(char *cp\)) 12.642 Tj -0 -7.85455 Td -(4803 {) 3.612 Tj -0 -9.16364 Td -(4804 struct inode *ip, *dp;) 17.458 Tj -0 -10.4727 Td -(4805 struct dirent de;) 14.448 Tj -0 -11.7818 Td -(4806 uint off, inum, dev;) 16.254 Tj -0 -13.0909 Td -(4807 ) 3.01 Tj -0 -14.4 Td -(4808 dp = namei\(cp, NAMEI_DELETE, &off, 0, 0\);) 28.896 Tj -0 -15.7091 Td -(4809 if\(dp == 0\)) 10.836 Tj -0 -17.0182 Td -(4810 return -1;) 11.438 Tj -0 -18.3273 Td -(4811 ) 3.01 Tj -0 -19.6364 Td -(4812 dev = dp->dev;) 12.642 Tj -0 -20.9455 Td -(4813 ) 3.01 Tj -0 -22.2545 Td -(4814 if\(readi\(dp, \(char*\)&de, off, sizeof\(de\)\) != sizeof\(de\) || de.inum == 0\)) 47.558 Tj -0 -23.5636 Td -(4815 panic\("unlink no entry"\);) 20.468 Tj -0 -24.8727 Td -(4816 ) 3.01 Tj -0 -26.1818 Td -(4817 inum = de.inum;) 13.244 Tj -0 -27.4909 Td -(4818 ) 3.01 Tj -0 -28.8 Td -(4819 memset\(&de, 0, sizeof\(de\)\);) 20.468 Tj -0 -30.1091 Td -(4820 if\(writei\(dp, \(char*\)&de, off, sizeof\(de\)\) != sizeof\(de\)\)) 38.528 Tj -0 -31.4182 Td -(4821 panic\("unlink dir write"\);) 21.07 Tj -0 -32.7273 Td -(4822 ) 3.01 Tj -0 -34.0364 Td -(4823 iupdate\(dp\);) 11.438 Tj -0 -35.3454 Td -(4824 iput\(dp\);) 9.632 Tj -0 -36.6545 Td -(4825 ) 3.01 Tj -0 -37.9636 Td -(4826 ip = iget\(dev, inum\);) 16.856 Tj -0 -39.2727 Td -(4827 ) 3.01 Tj -0 -40.5818 Td -(4828 if\(ip->nlink < 1\)) 14.448 Tj -0 -41.8909 Td -(4829 panic\("unlink nlink < 1"\);) 21.07 Tj -0 -43.2 Td -(4830 ) 3.01 Tj -0 -44.5091 Td -(4831 ip->nlink--;) 11.438 Tj -0 -45.8182 Td -(4832 ) 3.01 Tj -0 -47.1272 Td -(4833 iupdate\(ip\);) 11.438 Tj -0 -48.4363 Td -(4834 iput\(ip\);) 9.632 Tj -0 -49.7454 Td -(4835 ) 3.01 Tj -0 -51.0545 Td -(4836 return 0;) 9.632 Tj -0 -52.3636 Td -(4837 }) 3.612 Tj -0 -53.6727 Td -(4838 ) 3.01 Tj -0 -54.9818 Td -(4839 ) 3.01 Tj -0 -56.2909 Td -(4840 ) 3.01 Tj -0 -57.6 Td -(4841 ) 3.01 Tj -0 -58.9091 Td -(4842 ) 3.01 Tj -0 -60.2181 Td -(4843 ) 3.01 Tj -0 -61.5272 Td -(4844 ) 3.01 Tj -0 -62.8363 Td -(4845 ) 3.01 Tj -0 -64.1454 Td -(4846 ) 3.01 Tj -0 -65.4545 Td -(4847 ) 3.01 Tj -0 -66.7636 Td -(4848 ) 3.01 Tj -0 -68.0727 Td -(4849 ) 3.01 Tj -0 -72 Td -(Sheet 48) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/fs.c Page 17) 21.672 Tj -0 -3.92728 Td -(4850 // Create the path new as a link to the same inode as old.) 37.926 Tj -0 -5.23637 Td -(4851 int) 4.816 Tj -0 -6.54546 Td -(4852 link\(char *name1, char *name2\)) 21.07 Tj -0 -7.85455 Td -(4853 {) 3.612 Tj -0 -9.16364 Td -(4854 struct inode *ip, *dp;) 17.458 Tj -0 -10.4727 Td -(4855 char *last;) 10.836 Tj -0 -11.7818 Td -(4856 ) 3.01 Tj -0 -13.0909 Td -(4857 if\(\(ip = namei\(name1, NAMEI_LOOKUP, 0, 0, 0\)\) == 0\)) 34.916 Tj -0 -14.4 Td -(4858 return -1;) 11.438 Tj -0 -15.7091 Td -(4859 if\(ip->type == T_DIR\){) 17.458 Tj -0 -17.0182 Td -(4860 iput\(ip\);) 10.836 Tj -0 -18.3273 Td -(4861 return -1;) 11.438 Tj -0 -19.6364 Td -(4862 }) 4.816 Tj -0 -20.9455 Td -(4863 ) 3.01 Tj -0 -22.2545 Td -(4864 iunlock\(ip\);) 11.438 Tj -0 -23.5636 Td -(4865 ) 3.01 Tj -0 -24.8727 Td -(4866 if\(\(dp = namei\(name2, NAMEI_CREATE, 0, &last, 0\)\) == 0\) {) 38.528 Tj -0 -26.1818 Td -(4867 idecref\(ip\);) 12.642 Tj -0 -27.4909 Td -(4868 return -1;) 11.438 Tj -0 -28.8 Td -(4869 }) 4.816 Tj -0 -30.1091 Td -(4870 if\(dp->dev != ip->dev\){) 18.06 Tj -0 -31.4182 Td -(4871 idecref\(ip\);) 12.642 Tj -0 -32.7273 Td -(4872 iput\(dp\);) 10.836 Tj -0 -34.0364 Td -(4873 return -1;) 11.438 Tj -0 -35.3454 Td -(4874 }) 4.816 Tj -0 -36.6545 Td -(4875 ) 3.01 Tj -0 -37.9636 Td -(4876 ilock\(ip\);) 10.234 Tj -0 -39.2727 Td -(4877 ip->nlink++;) 11.438 Tj -0 -40.5818 Td -(4878 iupdate\(ip\);) 11.438 Tj -0 -41.8909 Td -(4879 ) 3.01 Tj -0 -43.2 Td -(4880 wdir\(dp, last, ip->inum\);) 19.264 Tj -0 -44.5091 Td -(4881 iput\(dp\);) 9.632 Tj -0 -45.8182 Td -(4882 iput\(ip\);) 9.632 Tj -0 -47.1272 Td -(4883 ) 3.01 Tj -0 -48.4363 Td -(4884 return 0;) 9.632 Tj -0 -49.7454 Td -(4885 }) 3.612 Tj -0 -51.0545 Td -(4886 ) 3.01 Tj -0 -52.3636 Td -(4887 ) 3.01 Tj -0 -53.6727 Td -(4888 ) 3.01 Tj -0 -54.9818 Td -(4889 ) 3.01 Tj -0 -56.2909 Td -(4890 ) 3.01 Tj -0 -57.6 Td -(4891 ) 3.01 Tj -0 -58.9091 Td -(4892 ) 3.01 Tj -0 -60.2181 Td -(4893 ) 3.01 Tj -0 -61.5272 Td -(4894 ) 3.01 Tj -0 -62.8363 Td -(4895 ) 3.01 Tj -0 -64.1454 Td -(4896 ) 3.01 Tj -0 -65.4545 Td -(4897 ) 3.01 Tj -0 -66.7636 Td -(4898 ) 3.01 Tj -0 -68.0727 Td -(4899 ) 3.01 Tj -0 -72 Td -(Sheet 48) 4.816 Tj +/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 @@ -15852,7 +16944,10 @@ pdfEndPage %%Page: 56 56 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -15860,241 +16955,257 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/file.c Page 1) 22.274 Tj -0 -3.92728 Td -(4900 #include "types.h") 13.846 Tj -0 -5.23637 Td -(4901 #include "stat.h") 13.244 Tj -0 -6.54546 Td -(4902 #include "param.h") 13.846 Tj -0 -7.85455 Td -(4903 #include "x86.h") 12.642 Tj -0 -9.16364 Td -(4904 #include "mmu.h") 12.642 Tj -0 -10.4727 Td -(4905 #include "proc.h") 13.244 Tj -0 -11.7818 Td -(4906 #include "defs.h") 13.244 Tj -0 -13.0909 Td -(4907 #include "file.h") 13.244 Tj -0 -14.4 Td -(4908 #include "spinlock.h") 15.652 Tj -0 -15.7091 Td -(4909 #include "dev.h") 12.642 Tj -0 -17.0182 Td -(4910 #include "fs.h") 12.04 Tj -0 -18.3273 Td -(4911 #include "fsvar.h") 13.846 Tj -0 -19.6364 Td -(4912 ) 3.01 Tj -0 -20.9455 Td -(4913 struct spinlock file_table_lock;) 22.274 Tj -0 -22.2545 Td -(4914 struct devsw devsw[NDEV];) 18.06 Tj -0 -23.5636 Td -(4915 ) 3.01 Tj -0 -24.8727 Td -(4916 struct file file[NFILE];) 17.458 Tj -0 -26.1818 Td -(4917 ) 3.01 Tj -0 -27.4909 Td -(4918 void) 5.418 Tj -0 -28.8 Td -(4919 fileinit\(void\)) 11.438 Tj -0 -30.1091 Td -(4920 {) 3.612 Tj -0 -31.4182 Td -(4921 initlock\(&file_table_lock, "file_table"\);) 28.896 Tj -0 -32.7273 Td -(4922 }) 3.612 Tj -0 -34.0364 Td -(4923 ) 3.01 Tj -0 -35.3454 Td -(4924 // Allocate a file structure) 19.866 Tj -0 -36.6545 Td -(4925 struct file*) 10.234 Tj -0 -37.9636 Td -(4926 filealloc\(void\)) 12.04 Tj -0 -39.2727 Td -(4927 {) 3.612 Tj -0 -40.5818 Td -(4928 int i;) 7.826 Tj -0 -41.8909 Td -(4929 ) 3.01 Tj -0 -43.2 Td -(4930 acquire\(&file_table_lock\);) 19.866 Tj -0 -44.5091 Td -(4931 for\(i = 0; i < NFILE; i++\){) 20.468 Tj -0 -45.8182 Td -(4932 if\(file[i].type == FD_CLOSED\){) 23.478 Tj -0 -47.1272 Td -(4933 file[i].type = FD_NONE;) 20.468 Tj -0 -48.4363 Td -(4934 file[i].ref = 1;) 16.254 Tj -0 -49.7454 Td -(4935 release\(&file_table_lock\);) 22.274 Tj -0 -51.0545 Td -(4936 return file + i;) 16.254 Tj -0 -52.3636 Td -(4937 }) 6.02 Tj -0 -53.6727 Td -(4938 }) 4.816 Tj -0 -54.9818 Td -(4939 release\(&file_table_lock\);) 19.866 Tj -0 -56.2909 Td -(4940 return 0;) 9.632 Tj -0 -57.6 Td -(4941 }) 3.612 Tj -0 -58.9091 Td -(4942 ) 3.01 Tj -0 -60.2181 Td -(4943 ) 3.01 Tj -0 -61.5272 Td -(4944 ) 3.01 Tj -0 -62.8363 Td -(4945 ) 3.01 Tj -0 -64.1454 Td -(4946 ) 3.01 Tj -0 -65.4545 Td -(4947 ) 3.01 Tj -0 -66.7636 Td -(4948 ) 3.01 Tj -0 -68.0727 Td -(4949 ) 3.01 Tj -0 -72 Td -(Sheet 49) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/file.c Page 2) 22.274 Tj -0 -3.92728 Td -(4950 // Write to file f. Addr is kernel address.) 29.498 Tj -0 -5.23637 Td -(4951 int) 4.816 Tj -0 -6.54546 Td -(4952 filewrite\(struct file *f, char *addr, int n\)) 29.498 Tj -0 -7.85455 Td -(4953 {) 3.612 Tj -0 -9.16364 Td -(4954 if\(f->writable == 0\)) 16.254 Tj -0 -10.4727 Td -(4955 return -1;) 11.438 Tj -0 -11.7818 Td -(4956 if\(f->type == FD_PIPE\){) 18.06 Tj -0 -13.0909 Td -(4957 return pipe_write\(f->pipe, addr, n\);) 27.09 Tj -0 -14.4 Td -(4958 } else if\(f->type == FD_FILE\) {) 22.876 Tj -0 -15.7091 Td -(4959 ilock\(f->ip\);) 13.244 Tj -0 -17.0182 Td -(4960 int r = writei\(f->ip, addr, f->off, n\);) 28.896 Tj -0 -18.3273 Td -(4961 if\(r > 0\) {) 12.04 Tj -0 -19.6364 Td -(4962 f->off += r;) 13.846 Tj -0 -20.9455 Td -(4963 }) 6.02 Tj -0 -22.2545 Td -(4964 iunlock\(f->ip\);) 14.448 Tj -0 -23.5636 Td -(4965 return r;) 10.836 Tj -0 -24.8727 Td -(4966 } else {) 9.03 Tj -0 -26.1818 Td -(4967 panic\("filewrite"\);) 16.856 Tj -0 -27.4909 Td -(4968 return -1;) 11.438 Tj -0 -28.8 Td -(4969 }) 4.816 Tj -0 -30.1091 Td -(4970 }) 3.612 Tj -0 -31.4182 Td -(4971 ) 3.01 Tj -0 -32.7273 Td -(4972 // Read from file f. Addr is kernel address.) 30.1 Tj -0 -34.0364 Td -(4973 int) 4.816 Tj -0 -35.3454 Td -(4974 fileread\(struct file *f, char *addr, int n\)) 28.896 Tj -0 -36.6545 Td -(4975 {) 3.612 Tj -0 -37.9636 Td -(4976 if\(f->readable == 0\)) 16.254 Tj -0 -39.2727 Td -(4977 return -1;) 11.438 Tj -0 -40.5818 Td -(4978 if\(f->type == FD_PIPE\){) 18.06 Tj -0 -41.8909 Td -(4979 return pipe_read\(f->pipe, addr, n\);) 26.488 Tj -0 -43.2 Td -(4980 } else if\(f->type == FD_FILE\){) 22.274 Tj -0 -44.5091 Td -(4981 ilock\(f->ip\);) 13.244 Tj -0 -45.8182 Td -(4982 int cc = readi\(f->ip, addr, f->off, n\);) 28.896 Tj -0 -47.1272 Td -(4983 if\(cc > 0\)) 11.438 Tj -0 -48.4363 Td -(4984 f->off += cc;) 14.448 Tj -0 -49.7454 Td -(4985 iunlock\(f->ip\);) 14.448 Tj -0 -51.0545 Td -(4986 return cc;) 11.438 Tj -0 -52.3636 Td -(4987 } else {) 9.03 Tj -0 -53.6727 Td -(4988 panic\("fileread"\);) 16.254 Tj -0 -54.9818 Td -(4989 return -1;) 11.438 Tj -0 -56.2909 Td -(4990 }) 4.816 Tj -0 -57.6 Td -(4991 }) 3.612 Tj -0 -58.9091 Td -(4992 ) 3.01 Tj -0 -60.2181 Td -(4993 ) 3.01 Tj -0 -61.5272 Td -(4994 ) 3.01 Tj -0 -62.8363 Td -(4995 ) 3.01 Tj -0 -64.1454 Td -(4996 ) 3.01 Tj -0 -65.4545 Td -(4997 ) 3.01 Tj -0 -66.7636 Td -(4998 ) 3.01 Tj -0 -68.0727 Td -(4999 ) 3.01 Tj -0 -72 Td -(Sheet 49) 4.816 Tj +/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 @@ -16106,6 +17217,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -16113,241 +17227,260 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/file.c Page 3) 22.274 Tj -0 -3.92728 Td -(5000 // Close file f. \(Decrement ref count, close when reaches 0.\)) 40.334 Tj -0 -5.23637 Td -(5001 void) 5.418 Tj -0 -6.54546 Td -(5002 fileclose\(struct file *f\)) 18.06 Tj -0 -7.85455 Td -(5003 {) 3.612 Tj -0 -9.16364 Td -(5004 acquire\(&file_table_lock\);) 19.866 Tj -0 -10.4727 Td -(5005 ) 3.01 Tj -0 -11.7818 Td -(5006 if\(f->ref < 1 || f->type == FD_CLOSED\)) 27.09 Tj -0 -13.0909 Td -(5007 panic\("fileclose"\);) 16.856 Tj -0 -14.4 Td -(5008 ) 3.01 Tj -0 -15.7091 Td -(5009 if\(--f->ref == 0\){) 15.05 Tj -0 -17.0182 Td -(5010 struct file dummy = *f;) 19.264 Tj -0 -18.3273 Td -(5011 ) 3.01 Tj -0 -19.6364 Td -(5012 f->ref = 0;) 12.04 Tj -0 -20.9455 Td -(5013 f->type = FD_CLOSED;) 17.458 Tj -0 -22.2545 Td -(5014 release\(&file_table_lock\);) 21.07 Tj -0 -23.5636 Td -(5015 ) 3.01 Tj -0 -24.8727 Td -(5016 if\(dummy.type == FD_PIPE\){) 21.07 Tj -0 -26.1818 Td -(5017 pipe_close\(dummy.pipe, dummy.writable\);) 30.1 Tj -0 -27.4909 Td -(5018 } else if\(dummy.type == FD_FILE\){) 25.284 Tj -0 -28.8 Td -(5019 idecref\(dummy.ip\);) 17.458 Tj -0 -30.1091 Td -(5020 } else {) 10.234 Tj -0 -31.4182 Td -(5021 panic\("fileclose"\);) 18.06 Tj -0 -32.7273 Td -(5022 }) 6.02 Tj -0 -34.0364 Td -(5023 } else {) 9.03 Tj -0 -35.3454 Td -(5024 release\(&file_table_lock\);) 21.07 Tj -0 -36.6545 Td -(5025 }) 4.816 Tj -0 -37.9636 Td -(5026 }) 3.612 Tj -0 -39.2727 Td -(5027 ) 3.01 Tj -0 -40.5818 Td -(5028 // Get metadata about file f.) 20.468 Tj -0 -41.8909 Td -(5029 int) 4.816 Tj -0 -43.2 Td -(5030 filestat\(struct file *f, struct stat *st\)) 27.692 Tj -0 -44.5091 Td -(5031 {) 3.612 Tj -0 -45.8182 Td -(5032 if\(f->type == FD_FILE\){) 18.06 Tj -0 -47.1272 Td -(5033 ilock\(f->ip\);) 13.244 Tj -0 -48.4363 Td -(5034 stati\(f->ip, st\);) 15.652 Tj -0 -49.7454 Td -(5035 iunlock\(f->ip\);) 14.448 Tj -0 -51.0545 Td -(5036 return 0;) 10.836 Tj -0 -52.3636 Td -(5037 } else) 7.826 Tj -0 -53.6727 Td -(5038 return -1;) 11.438 Tj -0 -54.9818 Td -(5039 }) 3.612 Tj -0 -56.2909 Td -(5040 ) 3.01 Tj -0 -57.6 Td -(5041 ) 3.01 Tj -0 -58.9091 Td -(5042 ) 3.01 Tj -0 -60.2181 Td -(5043 ) 3.01 Tj -0 -61.5272 Td -(5044 ) 3.01 Tj -0 -62.8363 Td -(5045 ) 3.01 Tj -0 -64.1454 Td -(5046 ) 3.01 Tj -0 -65.4545 Td -(5047 ) 3.01 Tj -0 -66.7636 Td -(5048 ) 3.01 Tj -0 -68.0727 Td -(5049 ) 3.01 Tj -0 -72 Td -(Sheet 50) 4.816 Tj +/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; iref < 1 || f->type == FD_CLOSED\)) 27.09 Tj -0 -11.7818 Td -(5056 panic\("fileincref"\);) 17.458 Tj -0 -13.0909 Td -(5057 f->ref++;) 9.632 Tj -0 -14.4 Td -(5058 release\(&file_table_lock\);) 19.866 Tj -0 -15.7091 Td -(5059 }) 3.612 Tj -0 -17.0182 Td -(5060 ) 3.01 Tj -0 -18.3273 Td -(5061 ) 3.01 Tj -0 -19.6364 Td -(5062 ) 3.01 Tj -0 -20.9455 Td -(5063 ) 3.01 Tj -0 -22.2545 Td -(5064 ) 3.01 Tj -0 -23.5636 Td -(5065 ) 3.01 Tj -0 -24.8727 Td -(5066 ) 3.01 Tj -0 -26.1818 Td -(5067 ) 3.01 Tj -0 -27.4909 Td -(5068 ) 3.01 Tj -0 -28.8 Td -(5069 ) 3.01 Tj -0 -30.1091 Td -(5070 ) 3.01 Tj -0 -31.4182 Td -(5071 ) 3.01 Tj -0 -32.7273 Td -(5072 ) 3.01 Tj -0 -34.0364 Td -(5073 ) 3.01 Tj -0 -35.3454 Td -(5074 ) 3.01 Tj -0 -36.6545 Td -(5075 ) 3.01 Tj -0 -37.9636 Td -(5076 ) 3.01 Tj -0 -39.2727 Td -(5077 ) 3.01 Tj -0 -40.5818 Td -(5078 ) 3.01 Tj -0 -41.8909 Td -(5079 ) 3.01 Tj -0 -43.2 Td -(5080 ) 3.01 Tj -0 -44.5091 Td -(5081 ) 3.01 Tj -0 -45.8182 Td -(5082 ) 3.01 Tj -0 -47.1272 Td -(5083 ) 3.01 Tj -0 -48.4363 Td -(5084 ) 3.01 Tj -0 -49.7454 Td -(5085 ) 3.01 Tj -0 -51.0545 Td -(5086 ) 3.01 Tj -0 -52.3636 Td -(5087 ) 3.01 Tj -0 -53.6727 Td -(5088 ) 3.01 Tj -0 -54.9818 Td -(5089 ) 3.01 Tj -0 -56.2909 Td -(5090 ) 3.01 Tj -0 -57.6 Td -(5091 ) 3.01 Tj -0 -58.9091 Td -(5092 ) 3.01 Tj -0 -60.2181 Td -(5093 ) 3.01 Tj -0 -61.5272 Td -(5094 ) 3.01 Tj -0 -62.8363 Td -(5095 ) 3.01 Tj -0 -64.1454 Td -(5096 ) 3.01 Tj -0 -65.4545 Td -(5097 ) 3.01 Tj -0 -66.7636 Td -(5098 ) 3.01 Tj -0 -68.0727 Td -(5099 ) 3.01 Tj -0 -72 Td -(Sheet 50) 4.816 Tj +/F9_0 8.70222 Tf +(Aug 30 10:08 2007 xv6/exec.c Page 2) 161.635 Tj +0 -28.4801 Td +(5050 // Allocate program memory.) 148.529 Tj +0 -37.9735 Td +(5051 sz = \(sz+PAGE-1\) & ~\(PAGE-1\);) 157.267 Tj +0 -47.4668 Td +(5052 mem = kalloc\(sz\);) 104.844 Tj +0 -56.9602 Td +(5053 if\(mem == 0\)) 83.0018 Tj +0 -66.4535 Td +(5054 goto bad;) 78.6333 Tj +0 -75.9469 Td +(5055 memset\(mem, 0, sz\);) 113.581 Tj +0 -85.4403 Td +(5056 ) 21.8426 Tj +0 -94.9336 Td +(5057 // Load program into memory.) 152.898 Tj +0 -104.427 Td +(5058 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 @@ -16358,7 +17491,10 @@ pdfEndPage %%Page: 58 58 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -16366,241 +17502,254 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysfile.c Page 1) 24.08 Tj -0 -3.92728 Td -(5100 #include "types.h") 13.846 Tj -0 -5.23637 Td -(5101 #include "stat.h") 13.244 Tj -0 -6.54546 Td -(5102 #include "param.h") 13.846 Tj -0 -7.85455 Td -(5103 #include "mmu.h") 12.642 Tj -0 -9.16364 Td -(5104 #include "proc.h") 13.244 Tj -0 -10.4727 Td -(5105 #include "defs.h") 13.244 Tj -0 -11.7818 Td -(5106 #include "x86.h") 12.642 Tj -0 -13.0909 Td -(5107 #include "traps.h") 13.846 Tj -0 -14.4 Td -(5108 #include "syscall.h") 15.05 Tj -0 -15.7091 Td -(5109 #include "spinlock.h") 15.652 Tj -0 -17.0182 Td -(5110 #include "buf.h") 12.642 Tj -0 -18.3273 Td -(5111 #include "fs.h") 12.04 Tj -0 -19.6364 Td -(5112 #include "fsvar.h") 13.846 Tj -0 -20.9455 Td -(5113 #include "elf.h") 12.642 Tj -0 -22.2545 Td -(5114 #include "file.h") 13.244 Tj -0 -23.5636 Td -(5115 #include "fcntl.h") 13.846 Tj -0 -24.8727 Td -(5116 ) 3.01 Tj -0 -26.1818 Td -(5117 // Fetch the nth word-sized system call argument as a file descriptor) 44.548 Tj -0 -27.4909 Td -(5118 // and return both the descriptor and the corresponding struct file.) 43.946 Tj -0 -28.8 Td -(5119 static int) 9.03 Tj -0 -30.1091 Td -(5120 argfd\(int argno, int *pfd, struct file **pf\)) 29.498 Tj -0 -31.4182 Td -(5121 {) 3.612 Tj -0 -32.7273 Td -(5122 int fd;) 8.428 Tj -0 -34.0364 Td -(5123 struct file *f;) 13.244 Tj -0 -35.3454 Td -(5124 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -36.6545 Td -(5125 ) 3.01 Tj -0 -37.9636 Td -(5126 if\(argint\(argno, &fd\) < 0\)) 19.866 Tj -0 -39.2727 Td -(5127 return -1;) 11.438 Tj -0 -40.5818 Td -(5128 if\(fd < 0 || fd >= NOFILE || \(f=p->ofile[fd]\) == 0\)) 34.916 Tj -0 -41.8909 Td -(5129 return -1;) 11.438 Tj -0 -43.2 Td -(5130 if\(pfd\)) 8.428 Tj -0 -44.5091 Td -(5131 *pfd = fd;) 11.438 Tj -0 -45.8182 Td -(5132 if\(pf\)) 7.826 Tj -0 -47.1272 Td -(5133 *pf = f;) 10.234 Tj -0 -48.4363 Td -(5134 return 0;) 9.632 Tj -0 -49.7454 Td -(5135 }) 3.612 Tj -0 -51.0545 Td -(5136 ) 3.01 Tj -0 -52.3636 Td -(5137 ) 3.01 Tj -0 -53.6727 Td -(5138 ) 3.01 Tj -0 -54.9818 Td -(5139 ) 3.01 Tj -0 -56.2909 Td -(5140 ) 3.01 Tj -0 -57.6 Td -(5141 ) 3.01 Tj -0 -58.9091 Td -(5142 ) 3.01 Tj -0 -60.2181 Td -(5143 ) 3.01 Tj -0 -61.5272 Td -(5144 ) 3.01 Tj -0 -62.8363 Td -(5145 ) 3.01 Tj -0 -64.1454 Td -(5146 ) 3.01 Tj -0 -65.4545 Td -(5147 ) 3.01 Tj -0 -66.7636 Td -(5148 ) 3.01 Tj -0 -68.0727 Td -(5149 ) 3.01 Tj -0 -72 Td -(Sheet 51) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysfile.c Page 2) 24.08 Tj -0 -3.92728 Td -(5150 // Allocate a file descriptor for the given file.) 32.508 Tj -0 -5.23637 Td -(5151 // Takes over file reference from caller on success.) 34.314 Tj -0 -6.54546 Td -(5152 static int) 9.03 Tj -0 -7.85455 Td -(5153 fdalloc\(struct file *f\)) 16.856 Tj -0 -9.16364 Td -(5154 {) 3.612 Tj -0 -10.4727 Td -(5155 int fd;) 8.428 Tj -0 -11.7818 Td -(5156 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -13.0909 Td -(5157 for\(fd = 0; fd < NOFILE; fd++\){) 22.876 Tj -0 -14.4 Td -(5158 if\(p->ofile[fd] == 0\){) 18.662 Tj -0 -15.7091 Td -(5159 p->ofile[fd] = f;) 16.856 Tj -0 -17.0182 Td -(5160 return fd;) 12.642 Tj -0 -18.3273 Td -(5161 }) 6.02 Tj -0 -19.6364 Td -(5162 }) 4.816 Tj -0 -20.9455 Td -(5163 return -1;) 10.234 Tj -0 -22.2545 Td -(5164 }) 3.612 Tj -0 -23.5636 Td -(5165 ) 3.01 Tj -0 -24.8727 Td -(5166 int) 4.816 Tj -0 -26.1818 Td -(5167 sys_pipe\(void\)) 11.438 Tj -0 -27.4909 Td -(5168 {) 3.612 Tj -0 -28.8 Td -(5169 int *fd;) 9.03 Tj -0 -30.1091 Td -(5170 struct file *rf = 0, *wf = 0;) 21.672 Tj -0 -31.4182 Td -(5171 int fd0, fd1;) 12.04 Tj -0 -32.7273 Td -(5172 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -34.0364 Td -(5173 ) 3.01 Tj -0 -35.3454 Td -(5174 if\(argptr\(0, \(void*\)&fd, 2*sizeof fd[0]\) < 0\)) 31.304 Tj -0 -36.6545 Td -(5175 return -1;) 11.438 Tj -0 -37.9636 Td -(5176 if\(pipe_alloc\(&rf, &wf\) < 0\)) 21.07 Tj -0 -39.2727 Td -(5177 return -1;) 11.438 Tj -0 -40.5818 Td -(5178 fd0 = -1;) 9.632 Tj -0 -41.8909 Td -(5179 if\(\(fd0 = fdalloc\(rf\)\) < 0 || \(fd1 = fdalloc\(wf\)\) < 0\){) 37.324 Tj -0 -43.2 Td -(5180 if\(fd0 >= 0\)) 12.642 Tj -0 -44.5091 Td -(5181 p->ofile[fd0] = 0;) 17.458 Tj -0 -45.8182 Td -(5182 fileclose\(rf\);) 13.846 Tj -0 -47.1272 Td -(5183 fileclose\(wf\);) 13.846 Tj -0 -48.4363 Td -(5184 return -1;) 11.438 Tj -0 -49.7454 Td -(5185 }) 4.816 Tj -0 -51.0545 Td -(5186 fd[0] = fd0;) 11.438 Tj -0 -52.3636 Td -(5187 fd[1] = fd1;) 11.438 Tj -0 -53.6727 Td -(5188 return 0;) 9.632 Tj -0 -54.9818 Td -(5189 }) 3.612 Tj -0 -56.2909 Td -(5190 ) 3.01 Tj -0 -57.6 Td -(5191 ) 3.01 Tj -0 -58.9091 Td -(5192 ) 3.01 Tj -0 -60.2181 Td -(5193 ) 3.01 Tj -0 -61.5272 Td -(5194 ) 3.01 Tj -0 -62.8363 Td -(5195 ) 3.01 Tj -0 -64.1454 Td -(5196 ) 3.01 Tj -0 -65.4545 Td -(5197 ) 3.01 Tj -0 -66.7636 Td -(5198 ) 3.01 Tj -0 -68.0727 Td -(5199 ) 3.01 Tj -0 -72 Td -(Sheet 51) 4.816 Tj +/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 @@ -16612,6 +17761,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -16619,241 +17771,253 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysfile.c Page 3) 24.08 Tj -0 -3.92728 Td -(5200 int) 4.816 Tj -0 -5.23637 Td -(5201 sys_write\(void\)) 12.04 Tj -0 -6.54546 Td -(5202 {) 3.612 Tj -0 -7.85455 Td -(5203 struct file *f;) 13.244 Tj -0 -9.16364 Td -(5204 int n;) 7.826 Tj -0 -10.4727 Td -(5205 char *cp;) 9.632 Tj -0 -11.7818 Td -(5206 ) 3.01 Tj -0 -13.0909 Td -(5207 if\(argfd\(0, 0, &f\) < 0 || argint\(2, &n\) < 0 || argptr\(1, &cp, n\) < 0\)) 45.752 Tj -0 -14.4 Td -(5208 return -1;) 11.438 Tj -0 -15.7091 Td -(5209 return filewrite\(f, cp, n\);) 20.468 Tj -0 -17.0182 Td -(5210 }) 3.612 Tj -0 -18.3273 Td -(5211 ) 3.01 Tj -0 -19.6364 Td -(5212 int) 4.816 Tj -0 -20.9455 Td -(5213 sys_read\(void\)) 11.438 Tj -0 -22.2545 Td -(5214 {) 3.612 Tj -0 -23.5636 Td -(5215 struct file *f;) 13.244 Tj -0 -24.8727 Td -(5216 int n;) 7.826 Tj -0 -26.1818 Td -(5217 char *cp;) 9.632 Tj -0 -27.4909 Td -(5218 ) 3.01 Tj -0 -28.8 Td -(5219 if\(argfd\(0, 0, &f\) < 0 || argint\(2, &n\) < 0 || argptr\(1, &cp, n\) < 0\)) 45.752 Tj -0 -30.1091 Td -(5220 return -1;) 11.438 Tj -0 -31.4182 Td -(5221 return fileread\(f, cp, n\);) 19.866 Tj -0 -32.7273 Td -(5222 }) 3.612 Tj -0 -34.0364 Td -(5223 ) 3.01 Tj -0 -35.3454 Td -(5224 int) 4.816 Tj -0 -36.6545 Td -(5225 sys_close\(void\)) 12.04 Tj -0 -37.9636 Td -(5226 {) 3.612 Tj -0 -39.2727 Td -(5227 int fd;) 8.428 Tj -0 -40.5818 Td -(5228 struct file *f;) 13.244 Tj -0 -41.8909 Td -(5229 ) 3.01 Tj -0 -43.2 Td -(5230 if\(argfd\(0, &fd, &f\) < 0\)) 19.264 Tj -0 -44.5091 Td -(5231 return -1;) 11.438 Tj -0 -45.8182 Td -(5232 curproc[cpu\(\)]->ofile[fd] = 0;) 22.274 Tj -0 -47.1272 Td -(5233 fileclose\(f\);) 12.04 Tj -0 -48.4363 Td -(5234 return 0;) 9.632 Tj -0 -49.7454 Td -(5235 }) 3.612 Tj -0 -51.0545 Td -(5236 ) 3.01 Tj -0 -52.3636 Td -(5237 ) 3.01 Tj -0 -53.6727 Td -(5238 ) 3.01 Tj -0 -54.9818 Td -(5239 ) 3.01 Tj -0 -56.2909 Td -(5240 ) 3.01 Tj -0 -57.6 Td -(5241 ) 3.01 Tj -0 -58.9091 Td -(5242 ) 3.01 Tj -0 -60.2181 Td -(5243 ) 3.01 Tj -0 -61.5272 Td -(5244 ) 3.01 Tj -0 -62.8363 Td -(5245 ) 3.01 Tj -0 -64.1454 Td -(5246 ) 3.01 Tj -0 -65.4545 Td -(5247 ) 3.01 Tj -0 -66.7636 Td -(5248 ) 3.01 Tj -0 -68.0727 Td -(5249 ) 3.01 Tj -0 -72 Td -(Sheet 52) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysfile.c Page 4) 24.08 Tj -0 -3.92728 Td -(5250 int) 4.816 Tj -0 -5.23637 Td -(5251 sys_open\(void\)) 11.438 Tj -0 -6.54546 Td -(5252 {) 3.612 Tj -0 -7.85455 Td -(5253 struct inode *ip, *dp;) 17.458 Tj -0 -9.16364 Td -(5254 char *path;) 10.836 Tj -0 -10.4727 Td -(5255 int omode;) 10.234 Tj -0 -11.7818 Td -(5256 int fd;) 8.428 Tj -0 -13.0909 Td -(5257 struct file *f;) 13.244 Tj -0 -14.4 Td -(5258 char *last;) 10.836 Tj -0 -15.7091 Td -(5259 ) 3.01 Tj -0 -17.0182 Td -(5260 if\(argstr\(0, &path\) < 0 || argint\(1, &omode\) < 0\)) 33.712 Tj -0 -18.3273 Td -(5261 return -1;) 11.438 Tj -0 -19.6364 Td -(5262 ) 3.01 Tj -0 -20.9455 Td -(5263 if\(omode & O_CREATE\){) 16.856 Tj -0 -22.2545 Td -(5264 dp = namei\(path, NAMEI_CREATE, 0, &last, &ip\);) 33.11 Tj -0 -23.5636 Td -(5265 if\(dp\){) 9.632 Tj -0 -24.8727 Td -(5266 ip = mknod1\(dp, last, T_FILE, 0, 0\);) 28.294 Tj -0 -26.1818 Td -(5267 iput\(dp\);) 12.04 Tj -0 -27.4909 Td -(5268 if\(ip == 0\)) 13.244 Tj -0 -28.8 Td -(5269 return -1;) 13.846 Tj -0 -30.1091 Td -(5270 } else if\(ip == 0\){) 16.856 Tj -0 -31.4182 Td -(5271 return -1;) 12.642 Tj -0 -32.7273 Td -(5272 } else if\(ip->type == T_DIR\){) 22.876 Tj -0 -34.0364 Td -(5273 iput\(ip\);) 12.04 Tj -0 -35.3454 Td -(5274 return -1;) 12.642 Tj -0 -36.6545 Td -(5275 }) 6.02 Tj -0 -37.9636 Td -(5276 } else {) 9.03 Tj -0 -39.2727 Td -(5277 ip = namei\(path, NAMEI_LOOKUP, 0, 0, 0\);) 29.498 Tj -0 -40.5818 Td -(5278 if\(ip == 0\)) 12.04 Tj -0 -41.8909 Td -(5279 return -1;) 12.642 Tj -0 -43.2 Td -(5280 }) 4.816 Tj -0 -44.5091 Td -(5281 if\(ip->type == T_DIR && \(\(omode & O_RDWR\) || \(omode & O_WRONLY\)\)\){) 43.946 Tj -0 -45.8182 Td -(5282 iput\(ip\);) 10.836 Tj -0 -47.1272 Td -(5283 return -1;) 11.438 Tj -0 -48.4363 Td -(5284 }) 4.816 Tj -0 -49.7454 Td -(5285 ) 3.01 Tj -0 -51.0545 Td -(5286 if\(\(f = filealloc\(\)\) == 0\){) 20.468 Tj -0 -52.3636 Td -(5287 iput\(ip\);) 10.836 Tj -0 -53.6727 Td -(5288 return -1;) 11.438 Tj -0 -54.9818 Td -(5289 }) 4.816 Tj -0 -56.2909 Td -(5290 if\(\(fd = fdalloc\(f\)\) < 0\){) 19.866 Tj -0 -57.6 Td -(5291 iput\(ip\);) 10.836 Tj -0 -58.9091 Td -(5292 fileclose\(f\);) 13.244 Tj -0 -60.2181 Td -(5293 return -1;) 11.438 Tj -0 -61.5272 Td -(5294 }) 4.816 Tj -0 -62.8363 Td -(5295 ) 3.01 Tj -0 -64.1454 Td -(5296 ) 3.01 Tj -0 -65.4545 Td -(5297 ) 3.01 Tj -0 -66.7636 Td -(5298 ) 3.01 Tj -0 -68.0727 Td -(5299 ) 3.01 Tj -0 -72 Td -(Sheet 52) 4.816 Tj +/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 @@ -16864,7 +18028,10 @@ pdfEndPage %%Page: 60 60 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -16872,241 +18039,253 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysfile.c Page 5) 24.08 Tj -0 -3.92728 Td -(5300 iunlock\(ip\);) 11.438 Tj -0 -5.23637 Td -(5301 f->type = FD_FILE;) 15.05 Tj -0 -6.54546 Td -(5302 if\(omode & O_RDWR\) {) 16.254 Tj -0 -7.85455 Td -(5303 f->readable = 1;) 15.05 Tj -0 -9.16364 Td -(5304 f->writable = 1;) 15.05 Tj -0 -10.4727 Td -(5305 } else if\(omode & O_WRONLY\) {) 21.672 Tj -0 -11.7818 Td -(5306 f->readable = 0;) 15.05 Tj -0 -13.0909 Td -(5307 f->writable = 1;) 15.05 Tj -0 -14.4 Td -(5308 } else {) 9.03 Tj -0 -15.7091 Td -(5309 f->readable = 1;) 15.05 Tj -0 -17.0182 Td -(5310 f->writable = 0;) 15.05 Tj -0 -18.3273 Td -(5311 }) 4.816 Tj -0 -19.6364 Td -(5312 f->ip = ip;) 10.836 Tj -0 -20.9455 Td -(5313 f->off = 0;) 10.836 Tj -0 -22.2545 Td -(5314 ) 3.01 Tj -0 -23.5636 Td -(5315 return fd;) 10.234 Tj -0 -24.8727 Td -(5316 }) 3.612 Tj -0 -26.1818 Td -(5317 ) 3.01 Tj -0 -27.4909 Td -(5318 int) 4.816 Tj -0 -28.8 Td -(5319 sys_mknod\(void\)) 12.04 Tj -0 -30.1091 Td -(5320 {) 3.612 Tj -0 -31.4182 Td -(5321 struct inode *nip;) 15.05 Tj -0 -32.7273 Td -(5322 char *path;) 10.836 Tj -0 -34.0364 Td -(5323 int len;) 9.03 Tj -0 -35.3454 Td -(5324 int type, major, minor;) 18.06 Tj -0 -36.6545 Td -(5325 ) 3.01 Tj -0 -37.9636 Td -(5326 if\(\(len=argstr\(0, &path\)\) < 0 || argint\(1, &type\) < 0 ||) 37.926 Tj -0 -39.2727 Td -(5327 argint\(2, &major\) < 0 || argint\(3, &minor\) < 0\)) 34.314 Tj -0 -40.5818 Td -(5328 return -1;) 11.438 Tj -0 -41.8909 Td -(5329 ) 3.01 Tj -0 -43.2 Td -(5330 if\(len >= DIRSIZ\)) 14.448 Tj -0 -44.5091 Td -(5331 return -1;) 11.438 Tj -0 -45.8182 Td -(5332 ) 3.01 Tj -0 -47.1272 Td -(5333 if\(\(nip = mknod\(path, type, major, minor\)\) == 0\)) 33.11 Tj -0 -48.4363 Td -(5334 return -1;) 11.438 Tj -0 -49.7454 Td -(5335 iput\(nip\);) 10.234 Tj -0 -51.0545 Td -(5336 return 0;) 9.632 Tj -0 -52.3636 Td -(5337 }) 3.612 Tj -0 -53.6727 Td -(5338 ) 3.01 Tj -0 -54.9818 Td -(5339 ) 3.01 Tj -0 -56.2909 Td -(5340 ) 3.01 Tj -0 -57.6 Td -(5341 ) 3.01 Tj -0 -58.9091 Td -(5342 ) 3.01 Tj -0 -60.2181 Td -(5343 ) 3.01 Tj -0 -61.5272 Td -(5344 ) 3.01 Tj -0 -62.8363 Td -(5345 ) 3.01 Tj -0 -64.1454 Td -(5346 ) 3.01 Tj -0 -65.4545 Td -(5347 ) 3.01 Tj -0 -66.7636 Td -(5348 ) 3.01 Tj -0 -68.0727 Td -(5349 ) 3.01 Tj -0 -72 Td -(Sheet 53) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysfile.c Page 6) 24.08 Tj -0 -3.92728 Td -(5350 int) 4.816 Tj -0 -5.23637 Td -(5351 sys_mkdir\(void\)) 12.04 Tj -0 -6.54546 Td -(5352 {) 3.612 Tj -0 -7.85455 Td -(5353 struct inode *nip;) 15.05 Tj -0 -9.16364 Td -(5354 struct inode *dp;) 14.448 Tj -0 -10.4727 Td -(5355 char *path;) 10.836 Tj -0 -11.7818 Td -(5356 struct dirent de;) 14.448 Tj -0 -13.0909 Td -(5357 char *last;) 10.836 Tj -0 -14.4 Td -(5358 ) 3.01 Tj -0 -15.7091 Td -(5359 if\(argstr\(0, &path\) < 0\)) 18.662 Tj -0 -17.0182 Td -(5360 return -1;) 11.438 Tj -0 -18.3273 Td -(5361 ) 3.01 Tj -0 -19.6364 Td -(5362 dp = namei\(path, NAMEI_CREATE, 0, &last, 0\);) 30.702 Tj -0 -20.9455 Td -(5363 if\(dp == 0\)) 10.836 Tj -0 -22.2545 Td -(5364 return -1;) 11.438 Tj -0 -23.5636 Td -(5365 ) 3.01 Tj -0 -24.8727 Td -(5366 nip = mknod1\(dp, last, T_DIR, 0, 0\);) 25.886 Tj -0 -26.1818 Td -(5367 if\(nip == 0\){) 12.04 Tj -0 -27.4909 Td -(5368 iput\(dp\);) 10.836 Tj -0 -28.8 Td -(5369 return -1;) 11.438 Tj -0 -30.1091 Td -(5370 }) 4.816 Tj -0 -31.4182 Td -(5371 ) 3.01 Tj -0 -32.7273 Td -(5372 dp->nlink++;) 11.438 Tj -0 -34.0364 Td -(5373 iupdate\(dp\);) 11.438 Tj -0 -35.3454 Td -(5374 ) 3.01 Tj -0 -36.6545 Td -(5375 memset\(de.name, '\\0', DIRSIZ\);) 22.274 Tj -0 -37.9636 Td -(5376 de.name[0] = '.';) 14.448 Tj -0 -39.2727 Td -(5377 de.inum = nip->inum;) 16.254 Tj -0 -40.5818 Td -(5378 writei\(nip, \(char*\) &de, 0, sizeof\(de\)\);) 28.294 Tj -0 -41.8909 Td -(5379 ) 3.01 Tj -0 -43.2 Td -(5380 de.inum = dp->inum;) 15.652 Tj -0 -44.5091 Td -(5381 de.name[1] = '.';) 14.448 Tj -0 -45.8182 Td -(5382 writei\(nip, \(char*\) &de, sizeof\(de\), sizeof\(de\)\);) 33.712 Tj -0 -47.1272 Td -(5383 ) 3.01 Tj -0 -48.4363 Td -(5384 iput\(dp\);) 9.632 Tj -0 -49.7454 Td -(5385 iput\(nip\);) 10.234 Tj -0 -51.0545 Td -(5386 ) 3.01 Tj -0 -52.3636 Td -(5387 return 0;) 9.632 Tj -0 -53.6727 Td -(5388 }) 3.612 Tj -0 -54.9818 Td -(5389 ) 3.01 Tj -0 -56.2909 Td -(5390 ) 3.01 Tj -0 -57.6 Td -(5391 ) 3.01 Tj -0 -58.9091 Td -(5392 ) 3.01 Tj -0 -60.2181 Td -(5393 ) 3.01 Tj -0 -61.5272 Td -(5394 ) 3.01 Tj -0 -62.8363 Td -(5395 ) 3.01 Tj -0 -64.1454 Td -(5396 ) 3.01 Tj -0 -65.4545 Td -(5397 ) 3.01 Tj -0 -66.7636 Td -(5398 ) 3.01 Tj -0 -68.0727 Td -(5399 ) 3.01 Tj -0 -72 Td -(Sheet 53) 4.816 Tj +/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 @@ -17118,6 +18297,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -17125,241 +18307,258 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysfile.c Page 7) 24.08 Tj -0 -3.92728 Td -(5400 int) 4.816 Tj -0 -5.23637 Td -(5401 sys_chdir\(void\)) 12.04 Tj -0 -6.54546 Td -(5402 {) 3.612 Tj -0 -7.85455 Td -(5403 struct proc *p = curproc[cpu\(\)];) 23.478 Tj -0 -9.16364 Td -(5404 struct inode *ip;) 14.448 Tj -0 -10.4727 Td -(5405 char *path;) 10.836 Tj -0 -11.7818 Td -(5406 ) 3.01 Tj -0 -13.0909 Td -(5407 if\(argstr\(0, &path\) < 0\)) 18.662 Tj -0 -14.4 Td -(5408 return -1;) 11.438 Tj -0 -15.7091 Td -(5409 ) 3.01 Tj -0 -17.0182 Td -(5410 if\(\(ip = namei\(path, NAMEI_LOOKUP, 0, 0, 0\)\) == 0\)) 34.314 Tj -0 -18.3273 Td -(5411 return -1;) 11.438 Tj -0 -19.6364 Td -(5412 ) 3.01 Tj -0 -20.9455 Td -(5413 if\(ip == p->cwd\) {) 15.05 Tj -0 -22.2545 Td -(5414 iput\(ip\);) 10.836 Tj -0 -23.5636 Td -(5415 return 0;) 10.836 Tj -0 -24.8727 Td -(5416 }) 4.816 Tj -0 -26.1818 Td -(5417 ) 3.01 Tj -0 -27.4909 Td -(5418 if\(ip->type != T_DIR\) {) 18.06 Tj -0 -28.8 Td -(5419 iput\(ip\);) 10.836 Tj -0 -30.1091 Td -(5420 return -1;) 11.438 Tj -0 -31.4182 Td -(5421 }) 4.816 Tj -0 -32.7273 Td -(5422 ) 3.01 Tj -0 -34.0364 Td -(5423 idecref\(p->cwd\);) 13.846 Tj -0 -35.3454 Td -(5424 p->cwd = ip;) 11.438 Tj -0 -36.6545 Td -(5425 iunlock\(p->cwd\);) 13.846 Tj -0 -37.9636 Td -(5426 return 0;) 9.632 Tj -0 -39.2727 Td -(5427 }) 3.612 Tj -0 -40.5818 Td -(5428 ) 3.01 Tj -0 -41.8909 Td -(5429 int) 4.816 Tj -0 -43.2 Td -(5430 sys_unlink\(void\)) 12.642 Tj -0 -44.5091 Td -(5431 {) 3.612 Tj -0 -45.8182 Td -(5432 char *path;) 10.836 Tj -0 -47.1272 Td -(5433 ) 3.01 Tj -0 -48.4363 Td -(5434 if\(argstr\(0, &path\) < 0\)) 18.662 Tj -0 -49.7454 Td -(5435 return -1;) 11.438 Tj -0 -51.0545 Td -(5436 return unlink\(path\);) 16.254 Tj -0 -52.3636 Td -(5437 }) 3.612 Tj -0 -53.6727 Td -(5438 ) 3.01 Tj -0 -54.9818 Td -(5439 int) 4.816 Tj -0 -56.2909 Td -(5440 sys_fstat\(void\)) 12.04 Tj -0 -57.6 Td -(5441 {) 3.612 Tj -0 -58.9091 Td -(5442 struct file *f;) 13.244 Tj -0 -60.2181 Td -(5443 struct stat *st;) 13.846 Tj -0 -61.5272 Td -(5444 ) 3.01 Tj -0 -62.8363 Td -(5445 if\(argfd\(0, 0, &f\) < 0 || argptr\(1, \(void*\)&st, sizeof *st\) < 0\)) 42.742 Tj -0 -64.1454 Td -(5446 return -1;) 11.438 Tj -0 -65.4545 Td -(5447 return filestat\(f, st\);) 18.06 Tj -0 -66.7636 Td -(5448 }) 3.612 Tj -0 -68.0727 Td -(5449 ) 3.01 Tj -0 -72 Td -(Sheet 54) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysfile.c Page 8) 24.08 Tj -0 -3.92728 Td -(5450 int) 4.816 Tj -0 -5.23637 Td -(5451 sys_dup\(void\)) 10.836 Tj -0 -6.54546 Td -(5452 {) 3.612 Tj -0 -7.85455 Td -(5453 struct file *f;) 13.244 Tj -0 -9.16364 Td -(5454 int fd;) 8.428 Tj -0 -10.4727 Td -(5455 ) 3.01 Tj -0 -11.7818 Td -(5456 if\(argfd\(0, 0, &f\) < 0\)) 18.06 Tj -0 -13.0909 Td -(5457 return -1;) 11.438 Tj -0 -14.4 Td -(5458 if\(\(fd=fdalloc\(f\)\) < 0\)) 18.06 Tj -0 -15.7091 Td -(5459 return -1;) 11.438 Tj -0 -17.0182 Td -(5460 fileincref\(f\);) 12.642 Tj -0 -18.3273 Td -(5461 return fd;) 10.234 Tj -0 -19.6364 Td -(5462 }) 3.612 Tj -0 -20.9455 Td -(5463 ) 3.01 Tj -0 -22.2545 Td -(5464 int) 4.816 Tj -0 -23.5636 Td -(5465 sys_link\(void\)) 11.438 Tj -0 -24.8727 Td -(5466 {) 3.612 Tj -0 -26.1818 Td -(5467 char *old, *new;) 13.846 Tj -0 -27.4909 Td -(5468 ) 3.01 Tj -0 -28.8 Td -(5469 if\(argstr\(0, &old\) < 0 || argstr\(1, &new\) < 0\)) 31.906 Tj -0 -30.1091 Td -(5470 return -1;) 11.438 Tj -0 -31.4182 Td -(5471 return link\(old, new\);) 17.458 Tj -0 -32.7273 Td -(5472 }) 3.612 Tj -0 -34.0364 Td -(5473 ) 3.01 Tj -0 -35.3454 Td -(5474 int) 4.816 Tj -0 -36.6545 Td -(5475 sys_exec\(void\)) 11.438 Tj -0 -37.9636 Td -(5476 {) 3.612 Tj -0 -39.2727 Td -(5477 struct proc *cp = curproc[cpu\(\)];) 24.08 Tj -0 -40.5818 Td -(5478 uint sz=0, ap, sp, p1, p2;) 19.866 Tj -0 -41.8909 Td -(5479 int i, nargs, argbytes, len;) 21.07 Tj -0 -43.2 Td -(5480 struct inode *ip;) 14.448 Tj -0 -44.5091 Td -(5481 struct elfhdr elf;) 15.05 Tj -0 -45.8182 Td -(5482 struct proghdr ph;) 15.05 Tj -0 -47.1272 Td -(5483 char *mem = 0;) 12.642 Tj -0 -48.4363 Td -(5484 char *path, *s;) 13.244 Tj -0 -49.7454 Td -(5485 uint argv;) 10.234 Tj -0 -51.0545 Td -(5486 ) 3.01 Tj -0 -52.3636 Td -(5487 if\(argstr\(0, &path\) < 0 || argint\(1, \(int*\)&argv\) < 0\)) 36.722 Tj -0 -53.6727 Td -(5488 return -1;) 11.438 Tj -0 -54.9818 Td -(5489 ) 3.01 Tj -0 -56.2909 Td -(5490 ip = namei\(path, NAMEI_LOOKUP, 0, 0, 0\);) 28.294 Tj -0 -57.6 Td -(5491 if\(ip == 0\)) 10.836 Tj -0 -58.9091 Td -(5492 return -1;) 11.438 Tj -0 -60.2181 Td -(5493 ) 3.01 Tj -0 -61.5272 Td -(5494 if\(readi\(ip, \(char*\)&elf, 0, sizeof\(elf\)\) < sizeof\(elf\)\)) 37.926 Tj -0 -62.8363 Td -(5495 goto bad;) 10.836 Tj -0 -64.1454 Td -(5496 ) 3.01 Tj -0 -65.4545 Td -(5497 if\(elf.magic != ELF_MAGIC\)) 19.866 Tj -0 -66.7636 Td -(5498 goto bad;) 10.836 Tj -0 -68.0727 Td -(5499 ) 3.01 Tj -0 -72 Td -(Sheet 54) 4.816 Tj +/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 @@ -17370,7 +18569,10 @@ pdfEndPage %%Page: 62 62 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -17378,241 +18580,258 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/sysfile.c Page 9) 24.08 Tj -0 -3.92728 Td -(5500 sz = 0;) 8.428 Tj -0 -5.23637 Td -(5501 for\(i = 0; i < elf.phnum; i++\){) 22.876 Tj -0 -6.54546 Td -(5502 if\(readi\(ip, \(char*\)&ph, elf.phoff + i * sizeof\(ph\),) 36.722 Tj -0 -7.85455 Td -(5503 sizeof\(ph\)\) != sizeof\(ph\)\)) 26.488 Tj -0 -9.16364 Td -(5504 goto bad;) 12.04 Tj -0 -10.4727 Td -(5505 if\(ph.type != ELF_PROG_LOAD\)) 22.274 Tj -0 -11.7818 Td -(5506 continue;) 12.04 Tj -0 -13.0909 Td -(5507 if\(ph.memsz < ph.filesz\)) 19.866 Tj -0 -14.4 Td -(5508 goto bad;) 12.04 Tj -0 -15.7091 Td -(5509 sz += ph.memsz;) 14.448 Tj -0 -17.0182 Td -(5510 }) 4.816 Tj -0 -18.3273 Td -(5511 ) 3.01 Tj -0 -19.6364 Td -(5512 sz += 4096 - \(sz % 4096\);) 19.264 Tj -0 -20.9455 Td -(5513 sz += 4096;) 10.836 Tj -0 -22.2545 Td -(5514 ) 3.01 Tj -0 -23.5636 Td -(5515 mem = kalloc\(sz\);) 14.448 Tj -0 -24.8727 Td -(5516 if\(mem == 0\)) 11.438 Tj -0 -26.1818 Td -(5517 goto bad;) 10.836 Tj -0 -27.4909 Td -(5518 memset\(mem, 0, sz\);) 15.652 Tj -0 -28.8 Td -(5519 ) 3.01 Tj -0 -30.1091 Td -(5520 nargs = 0;) 10.234 Tj -0 -31.4182 Td -(5521 argbytes = 0;) 12.04 Tj -0 -32.7273 Td -(5522 for\(i = 0;; i++\){) 14.448 Tj -0 -34.0364 Td -(5523 if\(fetchint\(cp, argv + 4*i, \(int*\)&ap\) < 0\)) 31.304 Tj -0 -35.3454 Td -(5524 goto bad;) 12.04 Tj -0 -36.6545 Td -(5525 if\(ap == 0\)) 12.04 Tj -0 -37.9636 Td -(5526 break;) 10.234 Tj -0 -39.2727 Td -(5527 len = fetchstr\(cp, ap, &s\);) 21.672 Tj -0 -40.5818 Td -(5528 if\(len < 0\)) 12.04 Tj -0 -41.8909 Td -(5529 goto bad;) 12.04 Tj -0 -43.2 Td -(5530 nargs++;) 10.234 Tj -0 -44.5091 Td -(5531 argbytes += len + 1;) 17.458 Tj -0 -45.8182 Td -(5532 }) 4.816 Tj -0 -47.1272 Td -(5533 ) 3.01 Tj -0 -48.4363 Td -(5534 // argn\\0) 9.632 Tj -0 -49.7454 Td -(5535 // ...) 7.826 Tj -0 -51.0545 Td -(5536 // arg0\\0) 9.632 Tj -0 -52.3636 Td -(5537 // 0) 6.622 Tj -0 -53.6727 Td -(5538 // ptr to argn) 12.642 Tj -0 -54.9818 Td -(5539 // ...) 7.826 Tj -0 -56.2909 Td -(5540 // 12: ptr to arg0) 15.05 Tj -0 -57.6 Td -(5541 // 8: argv \(points to ptr to arg0\)) 25.284 Tj -0 -58.9091 Td -(5542 // 4: argc) 10.836 Tj -0 -60.2181 Td -(5543 // 0: fake return pc) 16.856 Tj -0 -61.5272 Td -(5544 sp = sz - argbytes - \(nargs+1\)*4 - 4 - 4 - 4;) 31.304 Tj -0 -62.8363 Td -(5545 *\(uint*\)\(mem + sp\) = 0xffffffff;) 23.478 Tj -0 -64.1454 Td -(5546 *\(uint*\)\(mem + sp + 4\) = nargs;) 22.876 Tj -0 -65.4545 Td -(5547 *\(uint*\)\(mem + sp + 8\) = \(uint\)\(sp + 12\);) 28.896 Tj -0 -66.7636 Td -(5548 ) 3.01 Tj -0 -68.0727 Td -(5549 ) 3.01 Tj -0 -72 Td -(Sheet 55) 4.816 Tj +/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; imem, cp->sz\);) 18.06 Tj -0 -22.2545 Td -(5564 cp->sz = sz;) 11.438 Tj -0 -23.5636 Td -(5565 cp->mem = mem;) 12.642 Tj -0 -24.8727 Td -(5566 mem = 0;) 9.03 Tj -0 -26.1818 Td -(5567 ) 3.01 Tj -0 -27.4909 Td -(5568 for\(i = 0; i < elf.phnum; i++\){) 22.876 Tj -0 -28.8 Td -(5569 if\(readi\(ip, \(char*\)&ph, elf.phoff + i * sizeof\(ph\),) 36.722 Tj -0 -30.1091 Td -(5570 sizeof\(ph\)\) != sizeof\(ph\)\)) 26.488 Tj -0 -31.4182 Td -(5571 goto bad2;) 12.642 Tj -0 -32.7273 Td -(5572 if\(ph.type != ELF_PROG_LOAD\)) 22.274 Tj -0 -34.0364 Td -(5573 continue;) 12.04 Tj -0 -35.3454 Td -(5574 if\(ph.va + ph.memsz > sz\)) 20.468 Tj -0 -36.6545 Td -(5575 goto bad2;) 12.642 Tj -0 -37.9636 Td -(5576 if\(readi\(ip, cp->mem + ph.va, ph.offset, ph.filesz\) != ph.filesz\)) 44.548 Tj -0 -39.2727 Td -(5577 goto bad2;) 12.642 Tj -0 -40.5818 Td -(5578 memset\(cp->mem + ph.va + ph.filesz, 0, ph.memsz - ph.filesz\);) 42.14 Tj -0 -41.8909 Td -(5579 }) 4.816 Tj -0 -43.2 Td -(5580 ) 3.01 Tj -0 -44.5091 Td -(5581 iput\(ip\);) 9.632 Tj -0 -45.8182 Td -(5582 ) 3.01 Tj -0 -47.1272 Td -(5583 cp->tf->eip = elf.entry;) 18.662 Tj -0 -48.4363 Td -(5584 cp->tf->esp = sp;) 14.448 Tj -0 -49.7454 Td -(5585 setupsegs\(cp\);) 12.642 Tj -0 -51.0545 Td -(5586 ) 3.01 Tj -0 -52.3636 Td -(5587 return 0;) 9.632 Tj -0 -53.6727 Td -(5588 ) 3.01 Tj -0 -54.9818 Td -(5589 bad:) 6.02 Tj -0 -56.2909 Td -(5590 if\(mem\)) 8.428 Tj -0 -57.6 Td -(5591 kfree\(mem, sz\);) 14.448 Tj -0 -58.9091 Td -(5592 iput\(ip\);) 9.632 Tj -0 -60.2181 Td -(5593 return -1;) 10.234 Tj -0 -61.5272 Td -(5594 ) 3.01 Tj -0 -62.8363 Td -(5595 bad2:) 6.622 Tj -0 -64.1454 Td -(5596 iput\(ip\);) 9.632 Tj -0 -65.4545 Td -(5597 proc_exit\(\);) 11.438 Tj -0 -66.7636 Td -(5598 return 0;) 9.632 Tj -0 -68.0727 Td -(5599 }) 3.612 Tj -0 -72 Td -(Sheet 55) 4.816 Tj +/F9_0 8.70222 Tf +(Aug 30 10:08 2007 xv6/mp.c Page 2) 152.898 Tj +0 -28.4801 Td +(5550 // Search for the MP Floating Pointer Structure, which acc\ +ording to the) 332.007 Tj +0 -37.9735 Td +(5551 // spec is in one of the following three locations:) 244.637 Tj +0 -47.4668 Td +(5552 // 1\) in the first KB of the EBDA;) 170.372 Tj +0 -56.9602 Td +(5553 // 2\) in the last KB of system base memory;) 209.689 Tj +0 -66.4535 Td +(5554 // 3\) in the BIOS ROM between 0xE0000 and 0xFFFFF.) 240.268 Tj +0 -75.9469 Td +(5555 static struct mp*) 96.1073 Tj +0 -85.4403 Td +(5556 mp_search\(void\)) 87.3703 Tj +0 -94.9336 Td +(5557 {) 26.2111 Tj +0 -104.427 Td +(5558 uchar *bda;) 78.6333 Tj +0 -113.92 Td +(5559 uint p;) 61.1592 Tj +0 -123.414 Td +(5560 struct mp *mp;) 91.7388 Tj +0 -132.907 Td +(5561 ) 21.8426 Tj +0 -142.4 Td +(5562 bda = \(uchar*\)0x400;) 117.95 Tj +0 -151.894 Td +(5563 if\(\(p = \(bda[0x0F]<<8\)|bda[0x0E]\)\){) 183.478 Tj +0 -161.387 Td +(5564 if\(\(mp = mp_search1\(\(uchar*\)p, 1024\)\)\)) 205.32 Tj +0 -170.88 Td +(5565 return mp;) 91.7388 Tj +0 -180.374 Td +(5566 } else {) 65.5277 Tj +0 -189.867 Td +(5567 p = \(\(bda[0x14]<<8\)|bda[0x13]\)*1024;) 196.583 Tj +0 -199.361 Td +(5568 if\(\(mp = mp_search1\(\(uchar*\)p-1024, 1024\)\)\)) 227.163 Tj +0 -208.854 Td +(5569 return mp;) 91.7388 Tj +0 -218.347 Td +(5570 }) 34.9481 Tj +0 -227.841 Td +(5571 return mp_search1\(\(uchar*\)0xF0000, 0x10000\);) 222.794 Tj +0 -237.334 Td +(5572 }) 26.2111 Tj +0 -246.827 Td +(5573 ) 21.8426 Tj +0 -256.321 Td +(5574 // Search for an MP configuration table. For now,) 240.268 Tj +0 -265.814 Td +(5575 // don't accept the default configurations \(physaddr == 0\ +\).) 279.585 Tj +0 -275.307 Td +(5576 // Check for correct signature, calculate the checksum and\ +,) 279.585 Tj +0 -284.801 Td +(5577 // if correct, check the version.) 166.004 Tj +0 -294.294 Td +(5578 // To do: check extended table checksum.) 196.583 Tj +0 -303.788 Td +(5579 static struct mpconf*) 113.581 Tj +0 -313.281 Td +(5580 mp_config\(struct mp **pmp\)) 135.424 Tj +0 -322.774 Td +(5581 {) 26.2111 Tj +0 -332.268 Td +(5582 struct mpconf *conf;) 117.95 Tj +0 -341.761 Td +(5583 struct mp *mp;) 91.7388 Tj +0 -351.254 Td +(5584 ) 21.8426 Tj +0 -360.748 Td +(5585 if\(\(mp = mp_search\(\)\) == 0 || mp->physaddr == 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 @@ -17624,6 +18843,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -17631,241 +18853,267 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/pipe.c Page 1) 22.274 Tj -0 -3.92728 Td -(5600 #include "types.h") 13.846 Tj -0 -5.23637 Td -(5601 #include "param.h") 13.846 Tj -0 -6.54546 Td -(5602 #include "x86.h") 12.642 Tj -0 -7.85455 Td -(5603 #include "mmu.h") 12.642 Tj -0 -9.16364 Td -(5604 #include "proc.h") 13.244 Tj -0 -10.4727 Td -(5605 #include "defs.h") 13.244 Tj -0 -11.7818 Td -(5606 #include "file.h") 13.244 Tj -0 -13.0909 Td -(5607 #include "spinlock.h") 15.652 Tj -0 -14.4 Td -(5608 ) 3.01 Tj -0 -15.7091 Td -(5609 #define PIPESIZE 512) 15.05 Tj -0 -17.0182 Td -(5610 ) 3.01 Tj -0 -18.3273 Td -(5611 struct pipe {) 10.836 Tj -0 -19.6364 Td -(5612 int readopen; // read fd is still open) 27.09 Tj -0 -20.9455 Td -(5613 int writeopen; // write fd is still open) 28.294 Tj -0 -22.2545 Td -(5614 int writep; // next index to write) 24.682 Tj -0 -23.5636 Td -(5615 int readp; // next index to read) 24.08 Tj -0 -24.8727 Td -(5616 struct spinlock lock;) 16.856 Tj -0 -26.1818 Td -(5617 char data[PIPESIZE];) 16.254 Tj -0 -27.4909 Td -(5618 };) 4.214 Tj -0 -28.8 Td -(5619 ) 3.01 Tj -0 -30.1091 Td -(5620 int) 4.816 Tj -0 -31.4182 Td -(5621 pipe_alloc\(struct file **f0, struct file **f1\)) 30.702 Tj -0 -32.7273 Td -(5622 {) 3.612 Tj -0 -34.0364 Td -(5623 *f0 = *f1 = 0;) 12.642 Tj -0 -35.3454 Td -(5624 struct pipe *p = 0;) 15.652 Tj -0 -36.6545 Td -(5625 ) 3.01 Tj -0 -37.9636 Td -(5626 if\(\(*f0 = filealloc\(\)\) == 0\)) 21.07 Tj -0 -39.2727 Td -(5627 goto oops;) 11.438 Tj -0 -40.5818 Td -(5628 if\(\(*f1 = filealloc\(\)\) == 0\)) 21.07 Tj -0 -41.8909 Td -(5629 goto oops;) 11.438 Tj -0 -43.2 Td -(5630 if\(\(p = \(struct pipe*\) kalloc\(PAGE\)\) == 0\)) 29.498 Tj -0 -44.5091 Td -(5631 goto oops;) 11.438 Tj -0 -45.8182 Td -(5632 p->readopen = 1;) 13.846 Tj -0 -47.1272 Td -(5633 p->writeopen = 1;) 14.448 Tj -0 -48.4363 Td -(5634 p->writep = 0;) 12.642 Tj -0 -49.7454 Td -(5635 p->readp = 0;) 12.04 Tj -0 -51.0545 Td -(5636 initlock\(&p->lock, "pipe"\);) 20.468 Tj -0 -52.3636 Td -(5637 \(*f0\)->type = FD_PIPE;) 17.458 Tj -0 -53.6727 Td -(5638 \(*f0\)->readable = 1;) 16.254 Tj -0 -54.9818 Td -(5639 \(*f0\)->writable = 0;) 16.254 Tj -0 -56.2909 Td -(5640 \(*f0\)->pipe = p;) 13.846 Tj -0 -57.6 Td -(5641 \(*f1\)->type = FD_PIPE;) 17.458 Tj -0 -58.9091 Td -(5642 \(*f1\)->readable = 0;) 16.254 Tj -0 -60.2181 Td -(5643 \(*f1\)->writable = 1;) 16.254 Tj -0 -61.5272 Td -(5644 \(*f1\)->pipe = p;) 13.846 Tj -0 -62.8363 Td -(5645 return 0;) 9.632 Tj -0 -64.1454 Td -(5646 oops:) 6.622 Tj -0 -65.4545 Td -(5647 if\(p\)) 7.224 Tj -0 -66.7636 Td -(5648 kfree\(\(char*\) p, PAGE\);) 19.264 Tj -0 -68.0727 Td -(5649 if\(*f0\){) 9.03 Tj -0 -72 Td -(Sheet 56) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/pipe.c Page 2) 22.274 Tj -0 -3.92728 Td -(5650 \(*f0\)->type = FD_NONE;) 18.662 Tj -0 -5.23637 Td -(5651 fileclose\(*f0\);) 14.448 Tj -0 -6.54546 Td -(5652 }) 4.816 Tj -0 -7.85455 Td -(5653 if\(*f1\){) 9.03 Tj -0 -9.16364 Td -(5654 \(*f1\)->type = FD_NONE;) 18.662 Tj -0 -10.4727 Td -(5655 fileclose\(*f1\);) 14.448 Tj -0 -11.7818 Td -(5656 }) 4.816 Tj -0 -13.0909 Td -(5657 return -1;) 10.234 Tj -0 -14.4 Td -(5658 }) 3.612 Tj -0 -15.7091 Td -(5659 ) 3.01 Tj -0 -17.0182 Td -(5660 void) 5.418 Tj -0 -18.3273 Td -(5661 pipe_close\(struct pipe *p, int writable\)) 27.09 Tj -0 -19.6364 Td -(5662 {) 3.612 Tj -0 -20.9455 Td -(5663 acquire\(&p->lock\);) 15.05 Tj -0 -22.2545 Td -(5664 ) 3.01 Tj -0 -23.5636 Td -(5665 if\(writable\){) 12.04 Tj -0 -24.8727 Td -(5666 p->writeopen = 0;) 15.652 Tj -0 -26.1818 Td -(5667 wakeup\(&p->readp\);) 16.254 Tj -0 -27.4909 Td -(5668 } else {) 9.03 Tj -0 -28.8 Td -(5669 p->readopen = 0;) 15.05 Tj -0 -30.1091 Td -(5670 wakeup\(&p->writep\);) 16.856 Tj -0 -31.4182 Td -(5671 }) 4.816 Tj -0 -32.7273 Td -(5672 ) 3.01 Tj -0 -34.0364 Td -(5673 release\(&p->lock\);) 15.05 Tj -0 -35.3454 Td -(5674 ) 3.01 Tj -0 -36.6545 Td -(5675 if\(p->readopen == 0 && p->writeopen == 0\)) 28.896 Tj -0 -37.9636 Td -(5676 kfree\(\(char*\) p, PAGE\);) 19.264 Tj -0 -39.2727 Td -(5677 }) 3.612 Tj -0 -40.5818 Td -(5678 ) 3.01 Tj -0 -41.8909 Td -(5679 int) 4.816 Tj -0 -43.2 Td -(5680 pipe_write\(struct pipe *p, char *addr, int n\)) 30.1 Tj -0 -44.5091 Td -(5681 {) 3.612 Tj -0 -45.8182 Td -(5682 int i;) 7.826 Tj -0 -47.1272 Td -(5683 ) 3.01 Tj -0 -48.4363 Td -(5684 acquire\(&p->lock\);) 15.05 Tj -0 -49.7454 Td -(5685 ) 3.01 Tj -0 -51.0545 Td -(5686 for\(i = 0; i < n; i++\){) 18.06 Tj -0 -52.3636 Td -(5687 while\(\(\(p->writep + 1\) % PIPESIZE\) == p->readp\){) 34.314 Tj -0 -53.6727 Td -(5688 if\(p->readopen == 0\){) 19.264 Tj -0 -54.9818 Td -(5689 release\(&p->lock\);) 18.662 Tj -0 -56.2909 Td -(5690 return -1;) 13.846 Tj -0 -57.6 Td -(5691 }) 7.224 Tj -0 -58.9091 Td -(5692 wakeup\(&p->readp\);) 17.458 Tj -0 -60.2181 Td -(5693 sleep\(&p->writep, &p->lock\);) 23.478 Tj -0 -61.5272 Td -(5694 }) 6.02 Tj -0 -62.8363 Td -(5695 p->data[p->writep] = addr[i];) 22.876 Tj -0 -64.1454 Td -(5696 p->writep = \(p->writep + 1\) % PIPESIZE;) 28.896 Tj -0 -65.4545 Td -(5697 }) 4.816 Tj -0 -66.7636 Td -(5698 ) 3.01 Tj -0 -68.0727 Td -(5699 ) 3.01 Tj -0 -72 Td -(Sheet 56) 4.816 Tj +/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 @@ -17876,7 +19124,10 @@ pdfEndPage %%Page: 64 64 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -17884,241 +19135,257 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/pipe.c Page 3) 22.274 Tj -0 -3.92728 Td -(5700 release\(&p->lock\);) 15.05 Tj -0 -5.23637 Td -(5701 wakeup\(&p->readp\);) 15.05 Tj -0 -6.54546 Td -(5702 return i;) 9.632 Tj -0 -7.85455 Td -(5703 }) 3.612 Tj -0 -9.16364 Td -(5704 ) 3.01 Tj -0 -10.4727 Td -(5705 int) 4.816 Tj -0 -11.7818 Td -(5706 pipe_read\(struct pipe *p, char *addr, int n\)) 29.498 Tj -0 -13.0909 Td -(5707 {) 3.612 Tj -0 -14.4 Td -(5708 int i;) 7.826 Tj -0 -15.7091 Td -(5709 ) 3.01 Tj -0 -17.0182 Td -(5710 acquire\(&p->lock\);) 15.05 Tj -0 -18.3273 Td -(5711 ) 3.01 Tj -0 -19.6364 Td -(5712 while\(p->readp == p->writep\){) 21.672 Tj -0 -20.9455 Td -(5713 if\(p->writeopen == 0\){) 18.662 Tj -0 -22.2545 Td -(5714 release\(&p->lock\);) 17.458 Tj -0 -23.5636 Td -(5715 return 0;) 12.04 Tj -0 -24.8727 Td -(5716 }) 6.02 Tj -0 -26.1818 Td -(5717 sleep\(&p->readp, &p->lock\);) 21.672 Tj -0 -27.4909 Td -(5718 }) 4.816 Tj -0 -28.8 Td -(5719 ) 3.01 Tj -0 -30.1091 Td -(5720 for\(i = 0; i < n; i++\){) 18.06 Tj -0 -31.4182 Td -(5721 if\(p->readp == p->writep\)) 20.468 Tj -0 -32.7273 Td -(5722 break;) 10.234 Tj -0 -34.0364 Td -(5723 addr[i] = p->data[p->readp];) 22.274 Tj -0 -35.3454 Td -(5724 p->readp = \(p->readp + 1\) % PIPESIZE;) 27.692 Tj -0 -36.6545 Td -(5725 }) 4.816 Tj -0 -37.9636 Td -(5726 ) 3.01 Tj -0 -39.2727 Td -(5727 release\(&p->lock\);) 15.05 Tj -0 -40.5818 Td -(5728 wakeup\(&p->writep\);) 15.652 Tj -0 -41.8909 Td -(5729 return i;) 9.632 Tj -0 -43.2 Td -(5730 }) 3.612 Tj -0 -44.5091 Td -(5731 ) 3.01 Tj -0 -45.8182 Td -(5732 ) 3.01 Tj -0 -47.1272 Td -(5733 ) 3.01 Tj -0 -48.4363 Td -(5734 ) 3.01 Tj -0 -49.7454 Td -(5735 ) 3.01 Tj -0 -51.0545 Td -(5736 ) 3.01 Tj -0 -52.3636 Td -(5737 ) 3.01 Tj -0 -53.6727 Td -(5738 ) 3.01 Tj -0 -54.9818 Td -(5739 ) 3.01 Tj -0 -56.2909 Td -(5740 ) 3.01 Tj -0 -57.6 Td -(5741 ) 3.01 Tj -0 -58.9091 Td -(5742 ) 3.01 Tj -0 -60.2181 Td -(5743 ) 3.01 Tj -0 -61.5272 Td -(5744 ) 3.01 Tj -0 -62.8363 Td -(5745 ) 3.01 Tj -0 -64.1454 Td -(5746 ) 3.01 Tj -0 -65.4545 Td -(5747 ) 3.01 Tj -0 -66.7636 Td -(5748 ) 3.01 Tj -0 -68.0727 Td -(5749 ) 3.01 Tj -0 -72 Td -(Sheet 57) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/string.c Page 1) 23.478 Tj -0 -3.92728 Td -(5750 #include "types.h") 13.846 Tj -0 -5.23637 Td -(5751 #include "defs.h") 13.244 Tj -0 -6.54546 Td -(5752 ) 3.01 Tj -0 -7.85455 Td -(5753 void*) 6.02 Tj -0 -9.16364 Td -(5754 memset\(void *dst, int c, uint n\)) 22.274 Tj -0 -10.4727 Td -(5755 {) 3.612 Tj -0 -11.7818 Td -(5756 char *d = \(char*\) dst;) 17.458 Tj -0 -13.0909 Td -(5757 ) 3.01 Tj -0 -14.4 Td -(5758 while\(n-- > 0\)) 12.642 Tj -0 -15.7091 Td -(5759 *d++ = c;) 10.836 Tj -0 -17.0182 Td -(5760 ) 3.01 Tj -0 -18.3273 Td -(5761 return dst;) 10.836 Tj -0 -19.6364 Td -(5762 }) 3.612 Tj -0 -20.9455 Td -(5763 ) 3.01 Tj -0 -22.2545 Td -(5764 int) 4.816 Tj -0 -23.5636 Td -(5765 memcmp\(const void *v1, const void *v2, uint n\)) 30.702 Tj -0 -24.8727 Td -(5766 {) 3.612 Tj -0 -26.1818 Td -(5767 const uchar *s1 = \(const uchar*\) v1;) 25.886 Tj -0 -27.4909 Td -(5768 const uchar *s2 = \(const uchar*\) v2;) 25.886 Tj -0 -28.8 Td -(5769 ) 3.01 Tj -0 -30.1091 Td -(5770 while\(n-- > 0\) {) 13.846 Tj -0 -31.4182 Td -(5771 if\(*s1 != *s2\)) 13.846 Tj -0 -32.7273 Td -(5772 return \(int\) *s1 - \(int\) *s2;) 24.08 Tj -0 -34.0364 Td -(5773 s1++, s2++;) 12.04 Tj -0 -35.3454 Td -(5774 }) 4.816 Tj -0 -36.6545 Td -(5775 ) 3.01 Tj -0 -37.9636 Td -(5776 return 0;) 9.632 Tj -0 -39.2727 Td -(5777 }) 3.612 Tj -0 -40.5818 Td -(5778 ) 3.01 Tj -0 -41.8909 Td -(5779 void*) 6.02 Tj -0 -43.2 Td -(5780 memmove\(void *dst, const void *src, uint n\)) 28.896 Tj -0 -44.5091 Td -(5781 {) 3.612 Tj -0 -45.8182 Td -(5782 const char *s;) 12.642 Tj -0 -47.1272 Td -(5783 char *d;) 9.03 Tj -0 -48.4363 Td -(5784 ) 3.01 Tj -0 -49.7454 Td -(5785 s = src;) 9.03 Tj -0 -51.0545 Td -(5786 d = dst;) 9.03 Tj -0 -52.3636 Td -(5787 if\(s < d && s + n > d\) {) 18.662 Tj -0 -53.6727 Td -(5788 s += n;) 9.632 Tj -0 -54.9818 Td -(5789 d += n;) 9.632 Tj -0 -56.2909 Td -(5790 while\(n-- > 0\)) 13.846 Tj -0 -57.6 Td -(5791 *--d = *--s;) 13.846 Tj -0 -58.9091 Td -(5792 } else) 7.826 Tj -0 -60.2181 Td -(5793 while\(n-- > 0\)) 13.846 Tj -0 -61.5272 Td -(5794 *d++ = *s++;) 13.846 Tj -0 -62.8363 Td -(5795 ) 3.01 Tj -0 -64.1454 Td -(5796 return dst;) 10.836 Tj -0 -65.4545 Td -(5797 }) 3.612 Tj -0 -66.7636 Td -(5798 ) 3.01 Tj -0 -68.0727 Td -(5799 ) 3.01 Tj -0 -72 Td -(Sheet 57) 4.816 Tj +/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 @@ -18130,6 +19397,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -18137,241 +19407,265 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/string.c Page 2) 23.478 Tj -0 -3.92728 Td -(5800 int) 4.816 Tj -0 -5.23637 Td -(5801 strncmp\(const char *p, const char *q, uint n\)) 30.1 Tj -0 -6.54546 Td -(5802 {) 3.612 Tj -0 -7.85455 Td -(5803 while\(n > 0 && *p && *p == *q\)) 22.274 Tj -0 -9.16364 Td -(5804 n--, p++, q++;) 13.846 Tj -0 -10.4727 Td -(5805 if\(n == 0\)) 10.234 Tj -0 -11.7818 Td -(5806 return 0;) 10.836 Tj -0 -13.0909 Td -(5807 else) 6.622 Tj -0 -14.4 Td -(5808 return \(int\) \(\(uchar\) *p - \(uchar\) *q\);) 28.896 Tj -0 -15.7091 Td -(5809 }) 3.612 Tj -0 -17.0182 Td -(5810 ) 3.01 Tj -0 -18.3273 Td -(5811 ) 3.01 Tj -0 -19.6364 Td -(5812 ) 3.01 Tj -0 -20.9455 Td -(5813 ) 3.01 Tj -0 -22.2545 Td -(5814 ) 3.01 Tj -0 -23.5636 Td -(5815 ) 3.01 Tj -0 -24.8727 Td -(5816 ) 3.01 Tj -0 -26.1818 Td -(5817 ) 3.01 Tj -0 -27.4909 Td -(5818 ) 3.01 Tj -0 -28.8 Td -(5819 ) 3.01 Tj -0 -30.1091 Td -(5820 ) 3.01 Tj -0 -31.4182 Td -(5821 ) 3.01 Tj -0 -32.7273 Td -(5822 ) 3.01 Tj -0 -34.0364 Td -(5823 ) 3.01 Tj -0 -35.3454 Td -(5824 ) 3.01 Tj -0 -36.6545 Td -(5825 ) 3.01 Tj -0 -37.9636 Td -(5826 ) 3.01 Tj -0 -39.2727 Td -(5827 ) 3.01 Tj -0 -40.5818 Td -(5828 ) 3.01 Tj -0 -41.8909 Td -(5829 ) 3.01 Tj -0 -43.2 Td -(5830 ) 3.01 Tj -0 -44.5091 Td -(5831 ) 3.01 Tj -0 -45.8182 Td -(5832 ) 3.01 Tj -0 -47.1272 Td -(5833 ) 3.01 Tj -0 -48.4363 Td -(5834 ) 3.01 Tj -0 -49.7454 Td -(5835 ) 3.01 Tj -0 -51.0545 Td -(5836 ) 3.01 Tj -0 -52.3636 Td -(5837 ) 3.01 Tj -0 -53.6727 Td -(5838 ) 3.01 Tj -0 -54.9818 Td -(5839 ) 3.01 Tj -0 -56.2909 Td -(5840 ) 3.01 Tj -0 -57.6 Td -(5841 ) 3.01 Tj -0 -58.9091 Td -(5842 ) 3.01 Tj -0 -60.2181 Td -(5843 ) 3.01 Tj -0 -61.5272 Td -(5844 ) 3.01 Tj -0 -62.8363 Td -(5845 ) 3.01 Tj -0 -64.1454 Td -(5846 ) 3.01 Tj -0 -65.4545 Td -(5847 ) 3.01 Tj -0 -66.7636 Td -(5848 ) 3.01 Tj -0 -68.0727 Td -(5849 ) 3.01 Tj -0 -72 Td -(Sheet 58) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/ioapic.h Page 1) 23.478 Tj -0 -3.92728 Td -(5850 #define IO_APIC_BASE 0xFEC00000 // Default phys addr of IO APIC) 43.344 Tj -0 -5.23637 Td -(5851 #define IOAPIC_WINDOW 0x10 // Window register offset) 39.732 Tj -0 -6.54546 Td -(5852 ) 3.01 Tj -0 -7.85455 Td -(5853 // Constants relating to APIC ID registers) 28.294 Tj -0 -9.16364 Td -(5854 #define APIC_ID_MASK 0xff000000) 28.294 Tj -0 -10.4727 Td -(5855 #define APIC_ID_SHIFT 24) 23.478 Tj -0 -11.7818 Td -(5856 #define APIC_ID_CLUSTER 0xf0) 24.682 Tj -0 -13.0909 Td -(5857 #define APIC_ID_CLUSTER_ID 0x0f) 24.682 Tj -0 -14.4 Td -(5858 #define APIC_MAX_CLUSTER 0xe) 24.08 Tj -0 -15.7091 Td -(5859 #define APIC_MAX_INTRACLUSTER_ID 3) 23.478 Tj -0 -17.0182 Td -(5860 #define APIC_ID_CLUSTER_SHIFT 4) 22.876 Tj -0 -18.3273 Td -(5861 ) 3.01 Tj -0 -19.6364 Td -(5862 // Fields in VER) 12.642 Tj -0 -20.9455 Td -(5863 #define APIC_VER_VERSION 0x000000ff) 28.294 Tj -0 -22.2545 Td -(5864 #define APIC_VER_MAXLVT 0x00ff0000) 28.294 Tj -0 -23.5636 Td -(5865 #define MAXLVTSHIFT 16) 23.478 Tj -0 -24.8727 Td -(5866 ) 3.01 Tj -0 -26.1818 Td -(5867 // Indexes into IO APIC) 16.856 Tj -0 -27.4909 Td -(5868 #define IOAPIC_ID 0x00) 24.682 Tj -0 -28.8 Td -(5869 #define IOAPIC_VER 0x01) 24.682 Tj -0 -30.1091 Td -(5870 #define IOAPIC_ARB 0x02) 24.682 Tj -0 -31.4182 Td -(5871 #define IOAPIC_REDTBL 0x10) 24.682 Tj -0 -32.7273 Td -(5872 #define IOAPIC_REDTBL0 IOAPIC_REDTBL) 30.1 Tj -0 -34.0364 Td -(5873 #define IOAPIC_REDTBL1 \(IOAPIC_REDTBL+0x02\)) 34.314 Tj -0 -35.3454 Td -(5874 #define IOAPIC_REDTBL2 \(IOAPIC_REDTBL+0x04\)) 34.314 Tj -0 -36.6545 Td -(5875 #define IOAPIC_REDTBL3 \(IOAPIC_REDTBL+0x06\)) 34.314 Tj -0 -37.9636 Td -(5876 #define IOAPIC_REDTBL4 \(IOAPIC_REDTBL+0x08\)) 34.314 Tj -0 -39.2727 Td -(5877 #define IOAPIC_REDTBL5 \(IOAPIC_REDTBL+0x0a\)) 34.314 Tj -0 -40.5818 Td -(5878 #define IOAPIC_REDTBL6 \(IOAPIC_REDTBL+0x0c\)) 34.314 Tj -0 -41.8909 Td -(5879 #define IOAPIC_REDTBL7 \(IOAPIC_REDTBL+0x0e\)) 34.314 Tj -0 -43.2 Td -(5880 #define IOAPIC_REDTBL8 \(IOAPIC_REDTBL+0x10\)) 34.314 Tj -0 -44.5091 Td -(5881 #define IOAPIC_REDTBL9 \(IOAPIC_REDTBL+0x12\)) 34.314 Tj -0 -45.8182 Td -(5882 #define IOAPIC_REDTBL10 \(IOAPIC_REDTBL+0x14\)) 34.314 Tj -0 -47.1272 Td -(5883 #define IOAPIC_REDTBL11 \(IOAPIC_REDTBL+0x16\)) 34.314 Tj -0 -48.4363 Td -(5884 #define IOAPIC_REDTBL12 \(IOAPIC_REDTBL+0x18\)) 34.314 Tj -0 -49.7454 Td -(5885 #define IOAPIC_REDTBL13 \(IOAPIC_REDTBL+0x1a\)) 34.314 Tj -0 -51.0545 Td -(5886 #define IOAPIC_REDTBL14 \(IOAPIC_REDTBL+0x1c\)) 34.314 Tj -0 -52.3636 Td -(5887 #define IOAPIC_REDTBL15 \(IOAPIC_REDTBL+0x1e\)) 34.314 Tj -0 -53.6727 Td -(5888 #define IOAPIC_REDTBL16 \(IOAPIC_REDTBL+0x20\)) 34.314 Tj -0 -54.9818 Td -(5889 #define IOAPIC_REDTBL17 \(IOAPIC_REDTBL+0x22\)) 34.314 Tj -0 -56.2909 Td -(5890 #define IOAPIC_REDTBL18 \(IOAPIC_REDTBL+0x24\)) 34.314 Tj -0 -57.6 Td -(5891 #define IOAPIC_REDTBL19 \(IOAPIC_REDTBL+0x26\)) 34.314 Tj -0 -58.9091 Td -(5892 #define IOAPIC_REDTBL20 \(IOAPIC_REDTBL+0x28\)) 34.314 Tj -0 -60.2181 Td -(5893 #define IOAPIC_REDTBL21 \(IOAPIC_REDTBL+0x2a\)) 34.314 Tj -0 -61.5272 Td -(5894 #define IOAPIC_REDTBL22 \(IOAPIC_REDTBL+0x2c\)) 34.314 Tj -0 -62.8363 Td -(5895 #define IOAPIC_REDTBL23 \(IOAPIC_REDTBL+0x2e\)) 34.314 Tj -0 -64.1454 Td -(5896 ) 3.01 Tj -0 -65.4545 Td -(5897 // Fields in the IO APIC's redirection table entries) 34.314 Tj -0 -66.7636 Td -(5898 #define IOART_DEST APIC_ID_MASK // broadcast addr: all APICs) 43.946 Tj -0 -68.0727 Td -(5899 ) 3.01 Tj -0 -72 Td -(Sheet 58) 4.816 Tj +/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 @@ -18382,7 +19676,10 @@ pdfEndPage %%Page: 66 66 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -18390,241 +19687,262 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/ioapic.h Page 2) 23.478 Tj -0 -3.92728 Td -(5900 #define IOART_RESV 0x00fe0000 // reserved) 33.712 Tj -0 -5.23637 Td -(5901 ) 3.01 Tj -0 -6.54546 Td -(5902 #define IOART_INTMASK 0x00010000 // R/W: INTerrupt mask) 40.334 Tj -0 -7.85455 Td -(5903 #define IOART_INTMCLR 0x00000000 // clear, allow INTs) 42.742 Tj -0 -9.16364 Td -(5904 #define IOART_INTMSET 0x00010000 // set, inhibit INTs) 42.742 Tj -0 -10.4727 Td -(5905 ) 3.01 Tj -0 -11.7818 Td -(5906 #define IOART_TRGRMOD 0x00008000 // R/W: trigger mode) 39.13 Tj -0 -13.0909 Td -(5907 #define IOART_TRGREDG 0x00000000 // edge) 34.916 Tj -0 -14.4 Td -(5908 #define IOART_TRGRLVL 0x00008000 // level) 35.518 Tj -0 -15.7091 Td -(5909 ) 3.01 Tj -0 -17.0182 Td -(5910 #define IOART_REM_IRR 0x00004000 // RO: remote IRR) 37.324 Tj -0 -18.3273 Td -(5911 ) 3.01 Tj -0 -19.6364 Td -(5912 #define IOART_INTPOL 0x00002000 // R/W: INT input pin polarity) 45.15 Tj -0 -20.9455 Td -(5913 #define IOART_INTAHI 0x00000000 // active high) 38.528 Tj -0 -22.2545 Td -(5914 #define IOART_INTALO 0x00002000 // active low) 37.926 Tj -0 -23.5636 Td -(5915 ) 3.01 Tj -0 -24.8727 Td -(5916 #define IOART_DELIVS 0x00001000 // RO: delivery status) 40.334 Tj -0 -26.1818 Td -(5917 ) 3.01 Tj -0 -27.4909 Td -(5918 #define IOART_DESTMOD 0x00000800 // R/W: destination mode) 41.538 Tj -0 -28.8 Td -(5919 #define IOART_DESTPHY 0x00000000 // physical) 36.722 Tj -0 -30.1091 Td -(5920 #define IOART_DESTLOG 0x00000800 // logical) 36.12 Tj -0 -31.4182 Td -(5921 ) 3.01 Tj -0 -32.7273 Td -(5922 #define IOART_DELMOD 0x00000700 // R/W: delivery mode) 39.732 Tj -0 -34.0364 Td -(5923 #define IOART_DELFIXED 0x00000000 // fixed) 35.518 Tj -0 -35.3454 Td -(5924 #define IOART_DELLOPRI 0x00000100 // lowest priority) 41.538 Tj -0 -36.6545 Td -(5925 #define IOART_DELSMI 0x00000200 // System Management INT) 45.15 Tj -0 -37.9636 Td -(5926 #define IOART_DELRSV1 0x00000300 // reserved) 37.324 Tj -0 -39.2727 Td -(5927 #define IOART_DELNMI 0x00000400 // NMI signal) 38.528 Tj -0 -40.5818 Td -(5928 #define IOART_DELINIT 0x00000500 // INIT signal) 39.13 Tj -0 -41.8909 Td -(5929 #define IOART_DELRSV2 0x00000600 // reserved) 37.324 Tj -0 -43.2 Td -(5930 #define IOART_DELEXINT 0x00000700 // External INTerrupt) 43.344 Tj -0 -44.5091 Td -(5931 ) 3.01 Tj -0 -45.8182 Td -(5932 #define IOART_INTVEC 0x000000ff // R/W: INTerrupt vector field) 45.15 Tj -0 -47.1272 Td -(5933 ) 3.01 Tj -0 -48.4363 Td -(5934 // Fields in VER) 12.642 Tj -0 -49.7454 Td -(5935 #define IOART_VER_VERSION 0x000000ff) 28.294 Tj -0 -51.0545 Td -(5936 #define IOART_VER_MAXREDIR 0x00ff0000) 28.294 Tj -0 -52.3636 Td -(5937 #define MAXREDIRSHIFT 16) 23.478 Tj -0 -53.6727 Td -(5938 ) 3.01 Tj -0 -54.9818 Td -(5939 ) 3.01 Tj -0 -56.2909 Td -(5940 ) 3.01 Tj -0 -57.6 Td -(5941 ) 3.01 Tj -0 -58.9091 Td -(5942 ) 3.01 Tj -0 -60.2181 Td -(5943 ) 3.01 Tj -0 -61.5272 Td -(5944 ) 3.01 Tj -0 -62.8363 Td -(5945 ) 3.01 Tj -0 -64.1454 Td -(5946 ) 3.01 Tj -0 -65.4545 Td -(5947 ) 3.01 Tj -0 -66.7636 Td -(5948 ) 3.01 Tj -0 -68.0727 Td -(5949 ) 3.01 Tj -0 -72 Td -(Sheet 59) 4.816 Tj +/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<>24\) & 0xFF; // Read APIC ID) 36.722 Tj -0 -62.8363 Td -(6095 lapic_write\(LAPIC_LDR, \(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 @@ -18890,7 +20222,10 @@ pdfEndPage %%Page: 68 68 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -18898,241 +20233,260 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/lapic.c Page 4) 22.876 Tj -0 -3.92728 Td -(6100 // In virtual wire mode, set up the LINT0 and LINT1 as follows:) 42.14 Tj -0 -5.23637 Td -(6101 lapic_write\(LAPIC_LINT0, APIC_IMASK | APIC_EXTINT\);) 34.916 Tj -0 -6.54546 Td -(6102 lapic_write\(LAPIC_LINT1, APIC_IMASK | APIC_NMI\);) 33.11 Tj -0 -7.85455 Td -(6103 ) 3.01 Tj -0 -9.16364 Td -(6104 lapic_write\(LAPIC_EOI, 0\); // Ack any outstanding interrupts.) 40.936 Tj -0 -10.4727 Td -(6105 ) 3.01 Tj -0 -11.7818 Td -(6106 lvt = \(lapic_read\(LAPIC_VER\)>>16\) & 0xFF;) 28.896 Tj -0 -13.0909 Td -(6107 if\(lvt >= 4\)) 11.438 Tj -0 -14.4 Td -(6108 lapic_write\(LAPIC_PCINT, APIC_IMASK\);) 27.692 Tj -0 -15.7091 Td -(6109 lapic_write\(LAPIC_ERROR, IRQ_OFFSET+IRQ_ERROR\);) 32.508 Tj -0 -17.0182 Td -(6110 lapic_write\(LAPIC_ESR, 0\);) 19.866 Tj -0 -18.3273 Td -(6111 lapic_read\(LAPIC_ESR\);) 17.458 Tj -0 -19.6364 Td -(6112 ) 3.01 Tj -0 -20.9455 Td -(6113 // Issue an INIT Level De-Assert to synchronise arbitration ID's.) 43.344 Tj -0 -22.2545 Td -(6114 lapic_write\(LAPIC_ICRHI, 0\);) 21.07 Tj -0 -23.5636 Td -(6115 lapic_write\(LAPIC_ICRLO, LAPIC_ALLINC|APIC_LEVEL|) 33.712 Tj -0 -24.8727 Td -(6116 LAPIC_DEASSERT|APIC_INIT\);) 34.916 Tj -0 -26.1818 Td -(6117 while\(lapic_read\(LAPIC_ICRLO\) & APIC_DELIVS\)) 30.702 Tj -0 -27.4909 Td -(6118 ;) 6.02 Tj -0 -28.8 Td -(6119 }) 3.612 Tj -0 -30.1091 Td -(6120 ) 3.01 Tj -0 -31.4182 Td -(6121 void) 5.418 Tj -0 -32.7273 Td -(6122 lapic_enableintr\(void\)) 16.254 Tj -0 -34.0364 Td -(6123 {) 3.612 Tj -0 -35.3454 Td -(6124 if\(lapicaddr\)) 12.04 Tj -0 -36.6545 Td -(6125 lapic_write\(LAPIC_TPR, 0\);) 21.07 Tj -0 -37.9636 Td -(6126 }) 3.612 Tj -0 -39.2727 Td -(6127 ) 3.01 Tj -0 -40.5818 Td -(6128 void) 5.418 Tj -0 -41.8909 Td -(6129 lapic_disableintr\(void\)) 16.856 Tj -0 -43.2 Td -(6130 {) 3.612 Tj -0 -44.5091 Td -(6131 if\(lapicaddr\)) 12.04 Tj -0 -45.8182 Td -(6132 lapic_write\(LAPIC_TPR, 0xFF\);) 22.876 Tj -0 -47.1272 Td -(6133 }) 3.612 Tj -0 -48.4363 Td -(6134 ) 3.01 Tj -0 -49.7454 Td -(6135 void) 5.418 Tj -0 -51.0545 Td -(6136 lapic_eoi\(void\)) 12.04 Tj -0 -52.3636 Td -(6137 {) 3.612 Tj -0 -53.6727 Td -(6138 if\(lapicaddr\)) 12.04 Tj -0 -54.9818 Td -(6139 lapic_write\(LAPIC_EOI, 0\);) 21.07 Tj -0 -56.2909 Td -(6140 }) 3.612 Tj -0 -57.6 Td -(6141 ) 3.01 Tj -0 -58.9091 Td -(6142 ) 3.01 Tj -0 -60.2181 Td -(6143 ) 3.01 Tj -0 -61.5272 Td -(6144 ) 3.01 Tj -0 -62.8363 Td -(6145 ) 3.01 Tj -0 -64.1454 Td -(6146 ) 3.01 Tj -0 -65.4545 Td -(6147 ) 3.01 Tj -0 -66.7636 Td -(6148 ) 3.01 Tj -0 -68.0727 Td -(6149 ) 3.01 Tj -0 -72 Td -(Sheet 61) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/lapic.c Page 5) 22.876 Tj -0 -3.92728 Td -(6150 int) 4.816 Tj -0 -5.23637 Td -(6151 cpu\(void\)) 8.428 Tj -0 -6.54546 Td -(6152 {) 3.612 Tj -0 -7.85455 Td -(6153 int x;) 7.826 Tj -0 -9.16364 Td -(6154 if\(lapicaddr\)) 12.04 Tj -0 -10.4727 Td -(6155 x = \(lapic_read\(LAPIC_ID\)>>24\) & 0xFF;) 28.294 Tj -0 -11.7818 Td -(6156 else) 6.622 Tj -0 -13.0909 Td -(6157 x = 0;) 9.03 Tj -0 -14.4 Td -(6158 return x;) 9.632 Tj -0 -15.7091 Td -(6159 }) 3.612 Tj -0 -17.0182 Td -(6160 ) 3.01 Tj -0 -18.3273 Td -(6161 void) 5.418 Tj -0 -19.6364 Td -(6162 lapic_startap\(uchar apicid, int v\)) 23.478 Tj -0 -20.9455 Td -(6163 {) 3.612 Tj -0 -22.2545 Td -(6164 int crhi, i;) 11.438 Tj -0 -23.5636 Td -(6165 volatile int j = 0;) 15.652 Tj -0 -24.8727 Td -(6166 ) 3.01 Tj -0 -26.1818 Td -(6167 crhi = apicid<<24;) 15.05 Tj -0 -27.4909 Td -(6168 lapic_write\(LAPIC_ICRHI, crhi\);) 22.876 Tj -0 -28.8 Td -(6169 lapic_write\(LAPIC_ICRLO, LAPIC_FIELD|APIC_LEVEL|) 33.11 Tj -0 -30.1091 Td -(6170 LAPIC_ASSERT|APIC_INIT\);) 33.712 Tj -0 -31.4182 Td -(6171 ) 3.01 Tj -0 -32.7273 Td -(6172 while\(j++ < 10000\) {;}) 17.458 Tj -0 -34.0364 Td -(6173 lapic_write\(LAPIC_ICRLO, LAPIC_FIELD|APIC_LEVEL|) 33.11 Tj -0 -35.3454 Td -(6174 LAPIC_DEASSERT|APIC_INIT\);) 34.916 Tj -0 -36.6545 Td -(6175 ) 3.01 Tj -0 -37.9636 Td -(6176 while\(j++ < 1000000\) {;}) 18.662 Tj -0 -39.2727 Td -(6177 ) 3.01 Tj -0 -40.5818 Td -(6178 // in p9 code, this was i < 2, which is what the spec says on page B-3) 46.354 Tj -0 -41.8909 Td -(6179 for\(i = 0; i < 1; i++\){) 18.06 Tj -0 -43.2 Td -(6180 lapic_write\(LAPIC_ICRHI, crhi\);) 24.08 Tj -0 -44.5091 Td -(6181 lapic_write\(LAPIC_ICRLO, LAPIC_FIELD|APIC_EDGE|APIC_STARTUP|\(v/4096\)\);) 47.558 Tj -0 -45.8182 Td -(6182 while\(j++ < 100000\) {;}) 19.264 Tj -0 -47.1272 Td -(6183 }) 4.816 Tj -0 -48.4363 Td -(6184 }) 3.612 Tj -0 -49.7454 Td -(6185 ) 3.01 Tj -0 -51.0545 Td -(6186 ) 3.01 Tj -0 -52.3636 Td -(6187 ) 3.01 Tj -0 -53.6727 Td -(6188 ) 3.01 Tj -0 -54.9818 Td -(6189 ) 3.01 Tj -0 -56.2909 Td -(6190 ) 3.01 Tj -0 -57.6 Td -(6191 ) 3.01 Tj -0 -58.9091 Td -(6192 ) 3.01 Tj -0 -60.2181 Td -(6193 ) 3.01 Tj -0 -61.5272 Td -(6194 ) 3.01 Tj -0 -62.8363 Td -(6195 ) 3.01 Tj -0 -64.1454 Td -(6196 ) 3.01 Tj -0 -65.4545 Td -(6197 ) 3.01 Tj -0 -66.7636 Td -(6198 ) 3.01 Tj -0 -68.0727 Td -(6199 ) 3.01 Tj -0 -72 Td -(Sheet 61) 4.816 Tj +/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 @@ -19144,6 +20498,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -19151,241 +20508,256 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/ioapic.c Page 1) 23.478 Tj -0 -3.92728 Td -(6200 #include "types.h") 13.846 Tj -0 -5.23637 Td -(6201 #include "mp.h") 12.04 Tj -0 -6.54546 Td -(6202 #include "defs.h") 13.244 Tj -0 -7.85455 Td -(6203 #include "x86.h") 12.642 Tj -0 -9.16364 Td -(6204 #include "traps.h") 13.846 Tj -0 -10.4727 Td -(6205 #include "ioapic.h") 14.448 Tj -0 -11.7818 Td -(6206 ) 3.01 Tj -0 -13.0909 Td -(6207 struct ioapic {) 12.04 Tj -0 -14.4 Td -(6208 uint ioregsel; uint p01; uint p02; uint p03;) 31.304 Tj -0 -15.7091 Td -(6209 uint iowin; uint p11; uint p12; uint p13;) 31.304 Tj -0 -17.0182 Td -(6210 };) 4.214 Tj -0 -18.3273 Td -(6211 ) 3.01 Tj -0 -19.6364 Td -(6212 ) 3.01 Tj -0 -20.9455 Td -(6213 #define IOAPIC_REDTBL_LO\(i\) \(IOAPIC_REDTBL + \(i\) * 2\)) 35.518 Tj -0 -22.2545 Td -(6214 #define IOAPIC_REDTBL_HI\(i\) \(IOAPIC_REDTBL_LO\(i\) + 1\)) 35.518 Tj -0 -23.5636 Td -(6215 ) 3.01 Tj -0 -24.8727 Td -(6216 static uint) 9.632 Tj -0 -26.1818 Td -(6217 ioapic_read\(struct ioapic *io, int reg\)) 26.488 Tj -0 -27.4909 Td -(6218 {) 3.612 Tj -0 -28.8 Td -(6219 io->ioregsel = reg;) 15.652 Tj -0 -30.1091 Td -(6220 return io->iowin;) 14.448 Tj -0 -31.4182 Td -(6221 }) 3.612 Tj -0 -32.7273 Td -(6222 ) 3.01 Tj -0 -34.0364 Td -(6223 static void) 9.632 Tj -0 -35.3454 Td -(6224 ioapic_write\(struct ioapic *io, int reg, uint val\)) 33.11 Tj -0 -36.6545 Td -(6225 {) 3.612 Tj -0 -37.9636 Td -(6226 io->ioregsel = reg;) 15.652 Tj -0 -39.2727 Td -(6227 io->iowin = val;) 13.846 Tj -0 -40.5818 Td -(6228 }) 3.612 Tj -0 -41.8909 Td -(6229 ) 3.01 Tj -0 -43.2 Td -(6230 void) 5.418 Tj -0 -44.5091 Td -(6231 ioapic_init\(void\)) 13.244 Tj -0 -45.8182 Td -(6232 {) 3.612 Tj -0 -47.1272 Td -(6233 struct ioapic *io;) 15.05 Tj -0 -48.4363 Td -(6234 uint l, h;) 10.234 Tj -0 -49.7454 Td -(6235 int nintr;) 10.234 Tj -0 -51.0545 Td -(6236 uchar id;) 9.632 Tj -0 -52.3636 Td -(6237 int i;) 7.826 Tj -0 -53.6727 Td -(6238 ) 3.01 Tj -0 -54.9818 Td -(6239 if\(!ismp\)) 9.632 Tj -0 -56.2909 Td -(6240 return;) 9.632 Tj -0 -57.6 Td -(6241 ) 3.01 Tj -0 -58.9091 Td -(6242 io = \(struct ioapic*\) IO_APIC_BASE;) 25.284 Tj -0 -60.2181 Td -(6243 l = ioapic_read\(io, IOAPIC_VER\);) 23.478 Tj -0 -61.5272 Td -(6244 nintr = \(\(l & IOART_VER_MAXREDIR\) >> MAXREDIRSHIFT\) + 1;) 38.528 Tj -0 -62.8363 Td -(6245 id = ioapic_read\(io, IOAPIC_ID\) >> APIC_ID_SHIFT;) 33.712 Tj -0 -64.1454 Td -(6246 if\(id != ioapic_id\)) 15.652 Tj -0 -65.4545 Td -(6247 cprintf\("ioapic_init: id isn't equal to ioapic_id; not a MP\\n"\);) 43.946 Tj -0 -66.7636 Td -(6248 for\(i = 0; i < nintr; i++\) {) 21.07 Tj -0 -68.0727 Td -(6249 // active-hi and edge-triggered for ISA interrupts) 35.518 Tj -0 -72 Td -(Sheet 62) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/ioapic.c Page 2) 23.478 Tj -0 -3.92728 Td -(6250 // Assume that pin 0 on the first I/O APIC is an ExtINT pin.) 41.538 Tj -0 -5.23637 Td -(6251 // Assume that pins 1-15 are ISA interrupts) 31.304 Tj -0 -6.54546 Td -(6252 l = ioapic_read\(io, IOAPIC_REDTBL_LO\(i\)\);) 30.1 Tj -0 -7.85455 Td -(6253 l = l & ~IOART_INTMASK; // allow INTs) 28.294 Tj -0 -9.16364 Td -(6254 l |= IOART_INTMSET;) 16.856 Tj -0 -10.4727 Td -(6255 l = l & ~IOART_INTPOL; // active hi) 27.692 Tj -0 -11.7818 Td -(6256 l = l & ~IOART_TRGRMOD; // edgee triggered) 31.304 Tj -0 -13.0909 Td -(6257 l = l & ~IOART_DELMOD; // fixed) 25.284 Tj -0 -14.4 Td -(6258 l = l & ~IOART_DESTMOD; // physical mode) 30.1 Tj -0 -15.7091 Td -(6259 l = l | \(IRQ_OFFSET + i\); // vector) 26.488 Tj -0 -17.0182 Td -(6260 ioapic_write\(io, IOAPIC_REDTBL_LO\(i\), l\);) 30.1 Tj -0 -18.3273 Td -(6261 h = ioapic_read\(io, IOAPIC_REDTBL_HI\(i\)\);) 30.1 Tj -0 -19.6364 Td -(6262 h &= ~IOART_DEST;) 15.652 Tj -0 -20.9455 Td -(6263 ioapic_write\(io, IOAPIC_REDTBL_HI\(i\), h\);) 30.1 Tj -0 -22.2545 Td -(6264 }) 4.816 Tj -0 -23.5636 Td -(6265 }) 3.612 Tj -0 -24.8727 Td -(6266 ) 3.01 Tj -0 -26.1818 Td -(6267 void) 5.418 Tj -0 -27.4909 Td -(6268 ioapic_enable \(int irq, int cpunum\)) 24.08 Tj -0 -28.8 Td -(6269 {) 3.612 Tj -0 -30.1091 Td -(6270 uint l, h;) 10.234 Tj -0 -31.4182 Td -(6271 struct ioapic *io;) 15.05 Tj -0 -32.7273 Td -(6272 ) 3.01 Tj -0 -34.0364 Td -(6273 if\(!ismp\)) 9.632 Tj -0 -35.3454 Td -(6274 return;) 9.632 Tj -0 -36.6545 Td -(6275 ) 3.01 Tj -0 -37.9636 Td -(6276 io = \(struct ioapic*\) IO_APIC_BASE;) 25.284 Tj -0 -39.2727 Td -(6277 l = ioapic_read\(io, IOAPIC_REDTBL_LO\(irq\)\);) 30.1 Tj -0 -40.5818 Td -(6278 l = l & ~IOART_INTMASK; // allow INTs) 27.09 Tj -0 -41.8909 Td -(6279 ioapic_write\(io, IOAPIC_REDTBL_LO\(irq\), l\);) 30.1 Tj -0 -43.2 Td -(6280 h = ioapic_read\(io, IOAPIC_REDTBL_HI\(irq\)\);) 30.1 Tj -0 -44.5091 Td -(6281 h &= ~IOART_DEST;) 14.448 Tj -0 -45.8182 Td -(6282 h |= \(cpunum << APIC_ID_SHIFT\);) 22.876 Tj -0 -47.1272 Td -(6283 ioapic_write\(io, IOAPIC_REDTBL_HI\(irq\), h\);) 30.1 Tj -0 -48.4363 Td -(6284 }) 3.612 Tj -0 -49.7454 Td -(6285 ) 3.01 Tj -0 -51.0545 Td -(6286 ) 3.01 Tj -0 -52.3636 Td -(6287 ) 3.01 Tj -0 -53.6727 Td -(6288 ) 3.01 Tj -0 -54.9818 Td -(6289 ) 3.01 Tj -0 -56.2909 Td -(6290 ) 3.01 Tj -0 -57.6 Td -(6291 ) 3.01 Tj -0 -58.9091 Td -(6292 ) 3.01 Tj -0 -60.2181 Td -(6293 ) 3.01 Tj -0 -61.5272 Td -(6294 ) 3.01 Tj -0 -62.8363 Td -(6295 ) 3.01 Tj -0 -64.1454 Td -(6296 ) 3.01 Tj -0 -65.4545 Td -(6297 ) 3.01 Tj -0 -66.7636 Td -(6298 ) 3.01 Tj -0 -68.0727 Td -(6299 ) 3.01 Tj -0 -72 Td -(Sheet 62) 4.816 Tj +/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 @@ -19396,7 +20768,10 @@ pdfEndPage %%Page: 70 70 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -19404,241 +20779,253 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/picirq.c Page 1) 23.478 Tj -0 -3.92728 Td -(6300 #include "types.h") 13.846 Tj -0 -5.23637 Td -(6301 #include "x86.h") 12.642 Tj -0 -6.54546 Td -(6302 #include "traps.h") 13.846 Tj -0 -7.85455 Td -(6303 #include "defs.h") 13.244 Tj -0 -9.16364 Td -(6304 ) 3.01 Tj -0 -10.4727 Td -(6305 // I/O Addresses of the two 8259A programmable interrupt controllers) 43.946 Tj -0 -11.7818 Td -(6306 #define IO_PIC1 0x20 // Master \(IRQs 0-7\)) 34.314 Tj -0 -13.0909 Td -(6307 #define IO_PIC2 0xA0 // Slave \(IRQs 8-15\)) 34.314 Tj -0 -14.4 Td -(6308 ) 3.01 Tj -0 -15.7091 Td -(6309 #define IRQ_SLAVE 2 // IRQ at which slave connects to master) 46.354 Tj -0 -17.0182 Td -(6310 ) 3.01 Tj -0 -18.3273 Td -(6311 // Current IRQ mask.) 15.05 Tj -0 -19.6364 Td -(6312 // Initial IRQ mask has interrupt 2 enabled \(for slave 8259A\).) 40.334 Tj -0 -20.9455 Td -(6313 static ushort irq_mask_8259A = 0xFFFF & ~\(1<> 8\)\);) 25.284 Tj -0 -32.7273 Td -(6322 }) 3.612 Tj -0 -34.0364 Td -(6323 ) 3.01 Tj -0 -35.3454 Td -(6324 void) 5.418 Tj -0 -36.6545 Td -(6325 irq_enable\(int irq\)) 14.448 Tj -0 -37.9636 Td -(6326 {) 3.612 Tj -0 -39.2727 Td -(6327 irq_setmask_8259A\(irq_mask_8259A & ~\(1<= 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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/picirq.c Page 2) 23.478 Tj -0 -3.92728 Td -(6350 // ICW3: \(master PIC\) bit mask of IR lines connected to slaves) 42.14 Tj -0 -5.23637 Td -(6351 // \(slave PIC\) 3-bit # of slave's connection to master) 40.936 Tj -0 -6.54546 Td -(6352 outb\(IO_PIC1+1, 1<= 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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/console.c Page 2) 24.08 Tj -0 -3.92728 Td -(6450 if\(c == '\\n'\){) 12.642 Tj -0 -5.23637 Td -(6451 ind -= \(ind % 80\);) 16.254 Tj -0 -6.54546 Td -(6452 ind += 80;) 11.438 Tj -0 -7.85455 Td -(6453 } else {) 9.03 Tj -0 -9.16364 Td -(6454 c |= 0x0700; // black on white) 23.478 Tj -0 -10.4727 Td -(6455 crt[ind] = c;) 13.244 Tj -0 -11.7818 Td -(6456 ind++;) 9.03 Tj -0 -13.0909 Td -(6457 }) 4.816 Tj -0 -14.4 Td -(6458 ) 3.01 Tj -0 -15.7091 Td -(6459 if\(\(ind / 80\) >= 24\){) 16.856 Tj -0 -17.0182 Td -(6460 // scroll up) 12.642 Tj -0 -18.3273 Td -(6461 memmove\(crt, crt + 80, sizeof\(crt[0]\) * \(23 * 80\)\);) 36.12 Tj -0 -19.6364 Td -(6462 ind -= 80;) 11.438 Tj -0 -20.9455 Td -(6463 memset\(crt + ind, 0, sizeof\(crt[0]\) * \(\(24 * 80\) - ind\)\);) 39.732 Tj -0 -22.2545 Td -(6464 }) 4.816 Tj -0 -23.5636 Td -(6465 ) 3.01 Tj -0 -24.8727 Td -(6466 outb\(crtport, 14\);) 15.05 Tj -0 -26.1818 Td -(6467 outb\(crtport + 1, ind >> 8\);) 21.07 Tj -0 -27.4909 Td -(6468 outb\(crtport, 15\);) 15.05 Tj -0 -28.8 Td -(6469 outb\(crtport + 1, ind\);) 18.06 Tj -0 -30.1091 Td -(6470 }) 3.612 Tj -0 -31.4182 Td -(6471 ) 3.01 Tj -0 -32.7273 Td -(6472 void) 5.418 Tj -0 -34.0364 Td -(6473 printint\(int xx, int base, int sgn\)) 24.08 Tj -0 -35.3454 Td -(6474 {) 3.612 Tj -0 -36.6545 Td -(6475 char buf[16];) 12.04 Tj -0 -37.9636 Td -(6476 char digits[] = "0123456789ABCDEF";) 25.284 Tj -0 -39.2727 Td -(6477 int i = 0, neg = 0;) 15.652 Tj -0 -40.5818 Td -(6478 uint x;) 8.428 Tj -0 -41.8909 Td -(6479 ) 3.01 Tj -0 -43.2 Td -(6480 if\(sgn && xx < 0\){) 15.05 Tj -0 -44.5091 Td -(6481 neg = 1;) 10.234 Tj -0 -45.8182 Td -(6482 x = 0 - xx;) 12.04 Tj -0 -47.1272 Td -(6483 } else {) 9.03 Tj -0 -48.4363 Td -(6484 x = xx;) 9.632 Tj -0 -49.7454 Td -(6485 }) 4.816 Tj -0 -51.0545 Td -(6486 ) 3.01 Tj -0 -52.3636 Td -(6487 do {) 6.622 Tj -0 -53.6727 Td -(6488 buf[i++] = digits[x % base];) 22.274 Tj -0 -54.9818 Td -(6489 } while\(\(x /= base\) != 0\);) 19.866 Tj -0 -56.2909 Td -(6490 if\(neg\)) 8.428 Tj -0 -57.6 Td -(6491 buf[i++] = '-';) 14.448 Tj -0 -58.9091 Td -(6492 ) 3.01 Tj -0 -60.2181 Td -(6493 while\(--i >= 0\)) 13.244 Tj -0 -61.5272 Td -(6494 cons_putc\(buf[i]\);) 16.254 Tj -0 -62.8363 Td -(6495 }) 3.612 Tj -0 -64.1454 Td -(6496 ) 3.01 Tj -0 -65.4545 Td -(6497 ) 3.01 Tj -0 -66.7636 Td -(6498 ) 3.01 Tj -0 -68.0727 Td -(6499 ) 3.01 Tj -0 -72 Td -(Sheet 64) 4.816 Tj +/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 @@ -19902,7 +21306,10 @@ pdfEndPage %%Page: 72 72 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -19910,241 +21317,257 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/console.c Page 3) 24.08 Tj -0 -3.92728 Td -(6500 // Print to the console. only understands %d, %x, %p, %s.) 37.324 Tj -0 -5.23637 Td -(6501 void) 5.418 Tj -0 -6.54546 Td -(6502 cprintf\(char *fmt, ...\)) 16.856 Tj -0 -7.85455 Td -(6503 {) 3.612 Tj -0 -9.16364 Td -(6504 int i, state = 0, c, locking = 0;) 24.08 Tj -0 -10.4727 Td -(6505 uint *ap = \(uint*\)\(void*\)&fmt + 1;) 24.682 Tj -0 -11.7818 Td -(6506 ) 3.01 Tj -0 -13.0909 Td -(6507 if\(use_console_lock\){) 16.856 Tj -0 -14.4 Td -(6508 locking = 1;) 12.642 Tj -0 -15.7091 Td -(6509 acquire\(&console_lock\);) 19.264 Tj -0 -17.0182 Td -(6510 }) 4.816 Tj -0 -18.3273 Td -(6511 ) 3.01 Tj -0 -19.6364 Td -(6512 for\(i = 0; fmt[i]; i++\){) 18.662 Tj -0 -20.9455 Td -(6513 c = fmt[i] & 0xff;) 16.254 Tj -0 -22.2545 Td -(6514 if\(state == 0\){) 14.448 Tj -0 -23.5636 Td -(6515 if\(c == '%'\){) 14.448 Tj -0 -24.8727 Td -(6516 state = '%';) 15.05 Tj -0 -26.1818 Td -(6517 } else {) 11.438 Tj -0 -27.4909 Td -(6518 cons_putc\(c\);) 15.652 Tj -0 -28.8 Td -(6519 }) 7.224 Tj -0 -30.1091 Td -(6520 } else if\(state == '%'\){) 19.866 Tj -0 -31.4182 Td -(6521 if\(c == 'd'\){) 14.448 Tj -0 -32.7273 Td -(6522 printint\(*ap, 10, 1\);) 20.468 Tj -0 -34.0364 Td -(6523 ap++;) 10.836 Tj -0 -35.3454 Td -(6524 } else if\(c == 'x' || c == 'p'\){) 25.886 Tj -0 -36.6545 Td -(6525 printint\(*ap, 16, 0\);) 20.468 Tj -0 -37.9636 Td -(6526 ap++;) 10.836 Tj -0 -39.2727 Td -(6527 } else if\(c == 's'\){) 18.662 Tj -0 -40.5818 Td -(6528 char *s = \(char*\)*ap;) 20.468 Tj -0 -41.8909 Td -(6529 ap++;) 10.836 Tj -0 -43.2 Td -(6530 if\(s == 0\){) 14.448 Tj -0 -44.5091 Td -(6531 cons_putc\('0'\);) 18.06 Tj -0 -45.8182 Td -(6532 }else{) 11.438 Tj -0 -47.1272 Td -(6533 while\(*s != 0\){) 18.06 Tj -0 -48.4363 Td -(6534 cons_putc\(*s\);) 18.662 Tj -0 -49.7454 Td -(6535 s++;) 12.642 Tj -0 -51.0545 Td -(6536 }) 9.632 Tj -0 -52.3636 Td -(6537 }) 8.428 Tj -0 -53.6727 Td -(6538 } else if\(c == '%'\){) 18.662 Tj -0 -54.9818 Td -(6539 cons_putc\(c\);) 15.652 Tj -0 -56.2909 Td -(6540 } else {) 11.438 Tj -0 -57.6 Td -(6541 // Unknown % sequence. Print it to draw attention.) 38.528 Tj -0 -58.9091 Td -(6542 cons_putc\('%'\);) 16.856 Tj -0 -60.2181 Td -(6543 cons_putc\(c\);) 15.652 Tj -0 -61.5272 Td -(6544 }) 7.224 Tj -0 -62.8363 Td -(6545 state = 0;) 12.642 Tj -0 -64.1454 Td -(6546 }) 6.02 Tj -0 -65.4545 Td -(6547 }) 4.816 Tj -0 -66.7636 Td -(6548 ) 3.01 Tj -0 -68.0727 Td -(6549 ) 3.01 Tj -0 -72 Td -(Sheet 65) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/console.c Page 4) 24.08 Tj -0 -3.92728 Td -(6550 if\(locking\)) 10.836 Tj -0 -5.23637 Td -(6551 release\(&console_lock\);) 19.264 Tj -0 -6.54546 Td -(6552 }) 3.612 Tj -0 -7.85455 Td -(6553 ) 3.01 Tj -0 -9.16364 Td -(6554 void) 5.418 Tj -0 -10.4727 Td -(6555 panic\(char *s\)) 11.438 Tj -0 -11.7818 Td -(6556 {) 3.612 Tj -0 -13.0909 Td -(6557 int i;) 7.826 Tj -0 -14.4 Td -(6558 uint pcs[10];) 12.04 Tj -0 -15.7091 Td -(6559 ) 3.01 Tj -0 -17.0182 Td -(6560 __asm __volatile\("cli"\);) 18.662 Tj -0 -18.3273 Td -(6561 use_console_lock = 0;) 16.856 Tj -0 -19.6364 Td -(6562 cprintf\("panic \(%d\): ", cpu\(\)\);) 22.876 Tj -0 -20.9455 Td -(6563 cprintf\(s, 0\);) 12.642 Tj -0 -22.2545 Td -(6564 cprintf\("\\n", 0\);) 14.448 Tj -0 -23.5636 Td -(6565 getcallerpcs\(&s, pcs\);) 17.458 Tj -0 -24.8727 Td -(6566 for\(i=0; i<10; i++\)) 15.652 Tj -0 -26.1818 Td -(6567 cprintf\(" %p", pcs[i]\);) 19.264 Tj -0 -27.4909 Td -(6568 panicked = 1; // freeze other CPU) 24.08 Tj -0 -28.8 Td -(6569 for\(;;\)) 8.428 Tj -0 -30.1091 Td -(6570 ;) 6.02 Tj -0 -31.4182 Td -(6571 }) 3.612 Tj -0 -32.7273 Td -(6572 ) 3.01 Tj -0 -34.0364 Td -(6573 int) 4.816 Tj -0 -35.3454 Td -(6574 console_write\(int minor, char *buf, int n\)) 28.294 Tj -0 -36.6545 Td -(6575 {) 3.612 Tj -0 -37.9636 Td -(6576 int i;) 7.826 Tj -0 -39.2727 Td -(6577 ) 3.01 Tj -0 -40.5818 Td -(6578 acquire\(&console_lock\);) 18.06 Tj -0 -41.8909 Td -(6579 ) 3.01 Tj -0 -43.2 Td -(6580 for\(i = 0; i < n; i++\) {) 18.662 Tj -0 -44.5091 Td -(6581 cons_putc\(buf[i] & 0xff\);) 20.468 Tj -0 -45.8182 Td -(6582 }) 4.816 Tj -0 -47.1272 Td -(6583 ) 3.01 Tj -0 -48.4363 Td -(6584 release\(&console_lock\);) 18.06 Tj -0 -49.7454 Td -(6585 ) 3.01 Tj -0 -51.0545 Td -(6586 return n;) 9.632 Tj -0 -52.3636 Td -(6587 }) 3.612 Tj -0 -53.6727 Td -(6588 ) 3.01 Tj -0 -54.9818 Td -(6589 ) 3.01 Tj -0 -56.2909 Td -(6590 ) 3.01 Tj -0 -57.6 Td -(6591 ) 3.01 Tj -0 -58.9091 Td -(6592 ) 3.01 Tj -0 -60.2181 Td -(6593 ) 3.01 Tj -0 -61.5272 Td -(6594 ) 3.01 Tj -0 -62.8363 Td -(6595 ) 3.01 Tj -0 -64.1454 Td -(6596 ) 3.01 Tj -0 -65.4545 Td -(6597 ) 3.01 Tj -0 -66.7636 Td -(6598 ) 3.01 Tj -0 -68.0727 Td -(6599 ) 3.01 Tj -0 -72 Td -(Sheet 65) 4.816 Tj +/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 @@ -20156,6 +21579,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -20163,241 +21589,253 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/console.c Page 5) 24.08 Tj -0 -3.92728 Td -(6600 #define KBSTATP 0x64 // kbd controller status port\(I\)) 41.538 Tj -0 -5.23637 Td -(6601 #define KBS_DIB 0x01 // kbd data in buffer) 34.916 Tj -0 -6.54546 Td -(6602 #define KBDATAP 0x60 // kbd data port\(I\)) 33.712 Tj -0 -7.85455 Td -(6603 ) 3.01 Tj -0 -9.16364 Td -(6604 #define NO 0) 18.06 Tj -0 -10.4727 Td -(6605 ) 3.01 Tj -0 -11.7818 Td -(6606 #define SHIFT \(1<<0\)) 21.07 Tj -0 -13.0909 Td -(6607 #define CTL \(1<<1\)) 21.07 Tj -0 -14.4 Td -(6608 #define ALT \(1<<2\)) 21.07 Tj -0 -15.7091 Td -(6609 ) 3.01 Tj -0 -17.0182 Td -(6610 #define CAPSLOCK \(1<<3\)) 21.07 Tj -0 -18.3273 Td -(6611 #define NUMLOCK \(1<<4\)) 21.07 Tj -0 -19.6364 Td -(6612 #define SCROLLLOCK \(1<<5\)) 21.07 Tj -0 -20.9455 Td -(6613 ) 3.01 Tj -0 -22.2545 Td -(6614 #define E0ESC \(1<<6\)) 21.07 Tj -0 -23.5636 Td -(6615 ) 3.01 Tj -0 -24.8727 Td -(6616 // Special keycodes) 14.448 Tj -0 -26.1818 Td -(6617 #define KEY_HOME 0xE0) 19.866 Tj -0 -27.4909 Td -(6618 #define KEY_END 0xE1) 19.866 Tj -0 -28.8 Td -(6619 #define KEY_UP 0xE2) 19.866 Tj -0 -30.1091 Td -(6620 #define KEY_DN 0xE3) 19.866 Tj -0 -31.4182 Td -(6621 #define KEY_LF 0xE4) 19.866 Tj -0 -32.7273 Td -(6622 #define KEY_RT 0xE5) 19.866 Tj -0 -34.0364 Td -(6623 #define KEY_PGUP 0xE6) 19.866 Tj -0 -35.3454 Td -(6624 #define KEY_PGDN 0xE7) 19.866 Tj -0 -36.6545 Td -(6625 #define KEY_INS 0xE8) 19.866 Tj -0 -37.9636 Td -(6626 #define KEY_DEL 0xE9) 19.866 Tj -0 -39.2727 Td -(6627 ) 3.01 Tj -0 -40.5818 Td -(6628 static uchar shiftcode[256] =) 20.468 Tj -0 -41.8909 Td -(6629 {) 3.612 Tj -0 -43.2 Td -(6630 [0x1D] CTL,) 10.836 Tj -0 -44.5091 Td -(6631 [0x2A] SHIFT,) 12.04 Tj -0 -45.8182 Td -(6632 [0x36] SHIFT,) 12.04 Tj -0 -47.1272 Td -(6633 [0x38] ALT,) 10.836 Tj -0 -48.4363 Td -(6634 [0x9D] CTL,) 10.836 Tj -0 -49.7454 Td -(6635 [0xB8] ALT) 10.234 Tj -0 -51.0545 Td -(6636 };) 4.214 Tj -0 -52.3636 Td -(6637 ) 3.01 Tj -0 -53.6727 Td -(6638 static uchar togglecode[256] =) 21.07 Tj -0 -54.9818 Td -(6639 {) 3.612 Tj -0 -56.2909 Td -(6640 [0x3A] CAPSLOCK,) 13.846 Tj -0 -57.6 Td -(6641 [0x45] NUMLOCK,) 13.244 Tj -0 -58.9091 Td -(6642 [0x46] SCROLLLOCK) 14.448 Tj -0 -60.2181 Td -(6643 };) 4.214 Tj -0 -61.5272 Td -(6644 ) 3.01 Tj -0 -62.8363 Td -(6645 ) 3.01 Tj -0 -64.1454 Td -(6646 ) 3.01 Tj -0 -65.4545 Td -(6647 ) 3.01 Tj -0 -66.7636 Td -(6648 ) 3.01 Tj -0 -68.0727 Td -(6649 ) 3.01 Tj -0 -72 Td -(Sheet 66) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/console.c Page 6) 24.08 Tj -0 -3.92728 Td -(6650 static uchar normalmap[256] =) 20.468 Tj -0 -5.23637 Td -(6651 {) 3.612 Tj -0 -6.54546 Td -(6652 NO, 0x1B, '1', '2', '3', '4', '5', '6', // 0x00) 37.324 Tj -0 -7.85455 Td -(6653 '7', '8', '9', '0', '-', '=', '\\b', '\\t',) 32.508 Tj -0 -9.16364 Td -(6654 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', // 0x10) 37.324 Tj -0 -10.4727 Td -(6655 'o', 'p', '[', ']', '\\n', NO, 'a', 's',) 31.906 Tj -0 -11.7818 Td -(6656 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', // 0x20) 37.324 Tj -0 -13.0909 Td -(6657 '\\'', '`', NO, '\\\\', 'z', 'x', 'c', 'v',) 31.906 Tj -0 -14.4 Td -(6658 'b', 'n', 'm', ',', '.', '/', NO, '*', // 0x30) 37.324 Tj -0 -15.7091 Td -(6659 NO, ' ', NO, NO, NO, NO, NO, NO,) 31.304 Tj -0 -17.0182 Td -(6660 NO, NO, NO, NO, NO, NO, NO, '7', // 0x40) 37.324 Tj -0 -18.3273 Td -(6661 '8', '9', '-', '4', '5', '6', '+', '1',) 31.906 Tj -0 -19.6364 Td -(6662 '2', '3', '0', '.', NO, NO, NO, NO, // 0x50) 37.324 Tj -0 -20.9455 Td -(6663 [0x97] KEY_HOME,) 13.846 Tj -0 -22.2545 Td -(6664 [0x9C] '\\n', // KP_Enter) 21.672 Tj -0 -23.5636 Td -(6665 [0xB5] '/', // KP_Div) 20.468 Tj -0 -24.8727 Td -(6666 [0xC8] KEY_UP,) 12.642 Tj -0 -26.1818 Td -(6667 [0xC9] KEY_PGUP,) 13.846 Tj -0 -27.4909 Td -(6668 [0xCB] KEY_LF,) 12.642 Tj -0 -28.8 Td -(6669 [0xCD] KEY_RT,) 12.642 Tj -0 -30.1091 Td -(6670 [0xCF] KEY_END,) 13.244 Tj -0 -31.4182 Td -(6671 [0xD0] KEY_DN,) 12.642 Tj -0 -32.7273 Td -(6672 [0xD1] KEY_PGDN,) 13.846 Tj -0 -34.0364 Td -(6673 [0xD2] KEY_INS,) 13.244 Tj -0 -35.3454 Td -(6674 [0xD3] KEY_DEL) 12.642 Tj -0 -36.6545 Td -(6675 };) 4.214 Tj -0 -37.9636 Td -(6676 ) 3.01 Tj -0 -39.2727 Td -(6677 static uchar shiftmap[256] =) 19.866 Tj -0 -40.5818 Td -(6678 {) 3.612 Tj -0 -41.8909 Td -(6679 NO, 033, '!', '@', '#', '$', '%', '^', // 0x00) 37.324 Tj -0 -43.2 Td -(6680 '&', '*', '\(', '\)', '_', '+', '\\b', '\\t',) 32.508 Tj -0 -44.5091 Td -(6681 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', // 0x10) 37.324 Tj -0 -45.8182 Td -(6682 'O', 'P', '{', '}', '\\n', NO, 'A', 'S',) 31.906 Tj -0 -47.1272 Td -(6683 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', // 0x20) 37.324 Tj -0 -48.4363 Td -(6684 '"', '~', NO, '|', 'Z', 'X', 'C', 'V',) 31.906 Tj -0 -49.7454 Td -(6685 'B', 'N', 'M', '<', '>', '?', NO, '*', // 0x30) 37.324 Tj -0 -51.0545 Td -(6686 NO, ' ', NO, NO, NO, NO, NO, NO,) 31.304 Tj -0 -52.3636 Td -(6687 NO, NO, NO, NO, NO, NO, NO, '7', // 0x40) 37.324 Tj -0 -53.6727 Td -(6688 '8', '9', '-', '4', '5', '6', '+', '1',) 31.906 Tj -0 -54.9818 Td -(6689 '2', '3', '0', '.', NO, NO, NO, NO, // 0x50) 37.324 Tj -0 -56.2909 Td -(6690 [0x97] KEY_HOME,) 13.846 Tj -0 -57.6 Td -(6691 [0x9C] '\\n', // KP_Enter) 21.672 Tj -0 -58.9091 Td -(6692 [0xB5] '/', // KP_Div) 20.468 Tj -0 -60.2181 Td -(6693 [0xC8] KEY_UP,) 12.642 Tj -0 -61.5272 Td -(6694 [0xC9] KEY_PGUP,) 13.846 Tj -0 -62.8363 Td -(6695 [0xCB] KEY_LF,) 12.642 Tj -0 -64.1454 Td -(6696 [0xCD] KEY_RT,) 12.642 Tj -0 -65.4545 Td -(6697 [0xCF] KEY_END,) 13.244 Tj -0 -66.7636 Td -(6698 [0xD0] KEY_DN,) 12.642 Tj -0 -68.0727 Td -(6699 [0xD1] KEY_PGDN,) 13.846 Tj -0 -72 Td -(Sheet 66) 4.816 Tj +/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 @@ -20408,7 +21846,10 @@ pdfEndPage %%Page: 74 74 %%BeginPageSetup %%PageOrientation: Landscape -__tumble pdfStartPage +pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -20416,241 +21857,253 @@ __tumble pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/console.c Page 7) 24.08 Tj -0 -3.92728 Td -(6700 [0xD2] KEY_INS,) 13.244 Tj -0 -5.23637 Td -(6701 [0xD3] KEY_DEL) 12.642 Tj -0 -6.54546 Td -(6702 };) 4.214 Tj -0 -7.85455 Td -(6703 ) 3.01 Tj -0 -9.16364 Td -(6704 #define C\(x\) \(x - '@'\)) 16.254 Tj -0 -10.4727 Td -(6705 ) 3.01 Tj -0 -11.7818 Td -(6706 static uchar ctlmap[256] =) 18.662 Tj -0 -13.0909 Td -(6707 {) 3.612 Tj -0 -14.4 Td -(6708 NO, NO, NO, NO, NO, NO, NO, NO,) 43.946 Tj -0 -15.7091 Td -(6709 NO, NO, NO, NO, NO, NO, NO, NO,) 43.946 Tj -0 -17.0182 Td -(6710 C\('Q'\), C\('W'\), C\('E'\), C\('R'\), C\('T'\), C\('Y'\), C\('U'\), C\('I'\),) 46.354 Tj -0 -18.3273 Td -(6711 C\('O'\), C\('P'\), NO, NO, '\\r', NO, C\('A'\), C\('S'\),) 46.354 Tj -0 -19.6364 Td -(6712 C\('D'\), C\('F'\), C\('G'\), C\('H'\), C\('J'\), C\('K'\), C\('L'\), NO,) 43.946 Tj -0 -20.9455 Td -(6713 NO, NO, NO, C\('\\\\'\), C\('Z'\), C\('X'\), C\('C'\), C\('V'\),) 46.354 Tj -0 -22.2545 Td -(6714 C\('B'\), C\('N'\), C\('M'\), NO, NO, C\('/'\), NO, NO,) 43.946 Tj -0 -23.5636 Td -(6715 [0x97] KEY_HOME,) 13.846 Tj -0 -24.8727 Td -(6716 [0xB5] C\('/'\), // KP_Div) 20.468 Tj -0 -26.1818 Td -(6717 [0xC8] KEY_UP,) 12.642 Tj -0 -27.4909 Td -(6718 [0xC9] KEY_PGUP,) 13.846 Tj -0 -28.8 Td -(6719 [0xCB] KEY_LF,) 12.642 Tj -0 -30.1091 Td -(6720 [0xCD] KEY_RT,) 12.642 Tj -0 -31.4182 Td -(6721 [0xCF] KEY_END,) 13.244 Tj -0 -32.7273 Td -(6722 [0xD0] KEY_DN,) 12.642 Tj -0 -34.0364 Td -(6723 [0xD1] KEY_PGDN,) 13.846 Tj -0 -35.3454 Td -(6724 [0xD2] KEY_INS,) 13.244 Tj -0 -36.6545 Td -(6725 [0xD3] KEY_DEL) 12.642 Tj -0 -37.9636 Td -(6726 };) 4.214 Tj -0 -39.2727 Td -(6727 ) 3.01 Tj -0 -40.5818 Td -(6728 static uchar *charcode[4] = {) 20.468 Tj -0 -41.8909 Td -(6729 normalmap,) 10.234 Tj -0 -43.2 Td -(6730 shiftmap,) 9.632 Tj -0 -44.5091 Td -(6731 ctlmap,) 8.428 Tj -0 -45.8182 Td -(6732 ctlmap) 7.826 Tj -0 -47.1272 Td -(6733 };) 4.214 Tj -0 -48.4363 Td -(6734 ) 3.01 Tj -0 -49.7454 Td -(6735 #define KBD_BUF 64) 13.846 Tj -0 -51.0545 Td -(6736 char kbd_buf[KBD_BUF];) 16.254 Tj -0 -52.3636 Td -(6737 int kbd_r;) 9.03 Tj -0 -53.6727 Td -(6738 int kbd_w;) 9.03 Tj -0 -54.9818 Td -(6739 struct spinlock kbd_lock;) 18.06 Tj -0 -56.2909 Td -(6740 static uint shift;) 13.846 Tj -0 -57.6 Td -(6741 ) 3.01 Tj -0 -58.9091 Td -(6742 void) 5.418 Tj -0 -60.2181 Td -(6743 kbd_intr\(\)) 9.03 Tj -0 -61.5272 Td -(6744 {) 3.612 Tj -0 -62.8363 Td -(6745 uint st, data, c;) 14.448 Tj -0 -64.1454 Td -(6746 ) 3.01 Tj -0 -65.4545 Td -(6747 acquire\(&kbd_lock\);) 15.652 Tj -0 -66.7636 Td -(6748 ) 3.01 Tj -0 -68.0727 Td -(6749 ) 3.01 Tj -0 -72 Td -(Sheet 67) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/console.c Page 8) 24.08 Tj -0 -3.92728 Td -(6750 st = inb\(KBSTATP\);) 15.05 Tj -0 -5.23637 Td -(6751 if\(\(st & KBS_DIB\) == 0\)) 18.06 Tj -0 -6.54546 Td -(6752 goto out;) 10.836 Tj -0 -7.85455 Td -(6753 data = inb\(KBDATAP\);) 16.254 Tj -0 -9.16364 Td -(6754 ) 3.01 Tj -0 -10.4727 Td -(6755 if\(data == 0xE0\) {) 15.05 Tj -0 -11.7818 Td -(6756 shift |= E0ESC;) 14.448 Tj -0 -13.0909 Td -(6757 goto out;) 10.836 Tj -0 -14.4 Td -(6758 } else if\(data & 0x80\) {) 18.662 Tj -0 -15.7091 Td -(6759 // Key released) 14.448 Tj -0 -17.0182 Td -(6760 data = \(shift & E0ESC ? data : data & 0x7F\);) 31.906 Tj -0 -18.3273 Td -(6761 shift &= ~\(shiftcode[data] | E0ESC\);) 27.09 Tj -0 -19.6364 Td -(6762 goto out;) 10.836 Tj -0 -20.9455 Td -(6763 } else if\(shift & E0ESC\) {) 19.866 Tj -0 -22.2545 Td -(6764 // Last character was an E0 escape; or with 0x80) 34.314 Tj -0 -23.5636 Td -(6765 data |= 0x80;) 13.244 Tj -0 -24.8727 Td -(6766 shift &= ~E0ESC;) 15.05 Tj -0 -26.1818 Td -(6767 }) 4.816 Tj -0 -27.4909 Td -(6768 ) 3.01 Tj -0 -28.8 Td -(6769 shift |= shiftcode[data];) 19.264 Tj -0 -30.1091 Td -(6770 shift ^= togglecode[data];) 19.866 Tj -0 -31.4182 Td -(6771 ) 3.01 Tj -0 -32.7273 Td -(6772 c = charcode[shift & \(CTL | SHIFT\)][data];) 29.498 Tj -0 -34.0364 Td -(6773 if\(shift & CAPSLOCK\) {) 17.458 Tj -0 -35.3454 Td -(6774 if\('a' <= c && c <= 'z'\)) 19.866 Tj -0 -36.6545 Td -(6775 c += 'A' - 'a';) 15.652 Tj -0 -37.9636 Td -(6776 else if\('A' <= c && c <= 'Z'\)) 22.876 Tj -0 -39.2727 Td -(6777 c += 'a' - 'A';) 15.652 Tj -0 -40.5818 Td -(6778 }) 4.816 Tj -0 -41.8909 Td -(6779 ) 3.01 Tj -0 -43.2 Td -(6780 switch\(c\){) 10.234 Tj -0 -44.5091 Td -(6781 case 0:) 8.428 Tj -0 -45.8182 Td -(6782 // Ignore unknown keystrokes.) 22.876 Tj -0 -47.1272 Td -(6783 break;) 9.03 Tj -0 -48.4363 Td -(6784 ) 3.01 Tj -0 -49.7454 Td -(6785 case C\('T'\):) 11.438 Tj -0 -51.0545 Td -(6786 cprintf\("#"\); // Let user know we're still alive.) 35.518 Tj -0 -52.3636 Td -(6787 break;) 9.03 Tj -0 -53.6727 Td -(6788 ) 3.01 Tj -0 -54.9818 Td -(6789 case C\('P'\):) 11.438 Tj -0 -56.2909 Td -(6790 procdump\(\);) 12.04 Tj -0 -57.6 Td -(6791 break;) 9.03 Tj -0 -58.9091 Td -(6792 ) 3.01 Tj -0 -60.2181 Td -(6793 default:) 9.03 Tj -0 -61.5272 Td -(6794 if\(\(\(kbd_w + 1\) % KBD_BUF\) != kbd_r\){) 27.692 Tj -0 -62.8363 Td -(6795 kbd_buf[kbd_w++] = c;) 19.264 Tj -0 -64.1454 Td -(6796 if\(kbd_w >= KBD_BUF\)) 18.662 Tj -0 -65.4545 Td -(6797 kbd_w = 0;) 13.846 Tj -0 -66.7636 Td -(6798 wakeup\(&kbd_r\);) 15.652 Tj -0 -68.0727 Td -(6799 }) 6.02 Tj -0 -72 Td -(Sheet 67) 4.816 Tj +/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 @@ -20662,6 +22115,9 @@ pdfEndPage %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage +180 rotate +-612 -792 translate +0 0 612 792 re W %%EndPageSetup [] 0 d 1 i @@ -20669,241 +22125,1327 @@ pdfStartPage 0 J 10 M 1 w -0 g -0 G +/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 -Q -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 -7.0183 7.25185 0 564.72 738.865] Tm +[0 -0.967854 1 0 564.72 738.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/console.c Page 9) 24.08 Tj -0 -3.92728 Td -(6800 break;) 9.03 Tj -0 -5.23637 Td -(6801 }) 4.816 Tj -0 -6.54546 Td -(6802 ) 3.01 Tj -0 -7.85455 Td -(6803 out:) 5.418 Tj -0 -9.16364 Td -(6804 release\(&kbd_lock\);) 15.652 Tj -0 -10.4727 Td -(6805 }) 3.612 Tj -0 -11.7818 Td -(6806 ) 3.01 Tj -0 -13.0909 Td -(6807 int) 4.816 Tj -0 -14.4 Td -(6808 console_read\(int minor, char *dst, int n\)) 27.692 Tj -0 -15.7091 Td -(6809 {) 3.612 Tj -0 -17.0182 Td -(6810 uint target = n;) 13.846 Tj -0 -18.3273 Td -(6811 ) 3.01 Tj -0 -19.6364 Td -(6812 acquire\(&kbd_lock\);) 15.652 Tj -0 -20.9455 Td -(6813 ) 3.01 Tj -0 -22.2545 Td -(6814 while\(kbd_w == kbd_r\) {) 18.06 Tj -0 -23.5636 Td -(6815 sleep\(&kbd_r, &kbd_lock\);) 20.468 Tj -0 -24.8727 Td -(6816 }) 4.816 Tj -0 -26.1818 Td -(6817 ) 3.01 Tj -0 -27.4909 Td -(6818 while\(n > 0 && kbd_w != kbd_r\){) 22.876 Tj -0 -28.8 Td -(6819 *dst = \(kbd_buf[kbd_r]\) & 0xff;) 24.08 Tj -0 -30.1091 Td -(6820 cons_putc\(*dst & 0xff\);) 19.264 Tj -0 -31.4182 Td -(6821 dst++;) 9.03 Tj -0 -32.7273 Td -(6822 --n;) 7.826 Tj -0 -34.0364 Td -(6823 kbd_r++;) 10.234 Tj -0 -35.3454 Td -(6824 if\(kbd_r >= KBD_BUF\)) 17.458 Tj -0 -36.6545 Td -(6825 kbd_r = 0;) 12.642 Tj -0 -37.9636 Td -(6826 }) 4.816 Tj -0 -39.2727 Td -(6827 ) 3.01 Tj -0 -40.5818 Td -(6828 release\(&kbd_lock\);) 15.652 Tj -0 -41.8909 Td -(6829 ) 3.01 Tj -0 -43.2 Td -(6830 return target - n;) 15.05 Tj -0 -44.5091 Td -(6831 }) 3.612 Tj -0 -45.8182 Td -(6832 ) 3.01 Tj -0 -47.1272 Td -(6833 void) 5.418 Tj -0 -48.4363 Td -(6834 console_init\(\)) 11.438 Tj -0 -49.7454 Td -(6835 {) 3.612 Tj -0 -51.0545 Td -(6836 initlock\(&console_lock, "console"\);) 25.284 Tj -0 -52.3636 Td -(6837 initlock\(&kbd_lock, "kbd"\);) 20.468 Tj -0 -53.6727 Td -(6838 ) 3.01 Tj -0 -54.9818 Td -(6839 devsw[CONSOLE].write = console_write;) 26.488 Tj -0 -56.2909 Td -(6840 devsw[CONSOLE].read = console_read;) 25.284 Tj -0 -57.6 Td -(6841 ) 3.01 Tj -0 -58.9091 Td -(6842 irq_enable\(IRQ_KBD\);) 16.254 Tj -0 -60.2181 Td -(6843 ioapic_enable\(IRQ_KBD, 0\);) 19.866 Tj -0 -61.5272 Td -(6844 ) 3.01 Tj -0 -62.8363 Td -(6845 use_console_lock = 1;) 16.856 Tj -0 -64.1454 Td -(6846 }) 3.612 Tj -0 -65.4545 Td -(6847 ) 3.01 Tj -0 -66.7636 Td -(6848 ) 3.01 Tj -0 -68.0727 Td -(6849 ) 3.01 Tj -0 -72 Td -(Sheet 68) 4.816 Tj +/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 -7.0183 7.25185 0 564.72 392.865] Tm +[0 -0.967854 1 0 564.72 392.864] Tm 0 0 Td -/F10_0 1 Tf -(Sep 8 11:37 2006 xv6/8253pit.c Page 1) 24.08 Tj -0 -3.92728 Td -(6850 #include "types.h") 13.846 Tj -0 -5.23637 Td -(6851 #include "x86.h") 12.642 Tj -0 -6.54546 Td -(6852 #include "defs.h") 13.244 Tj -0 -7.85455 Td -(6853 #include "traps.h") 13.846 Tj -0 -9.16364 Td -(6854 ) 3.01 Tj -0 -10.4727 Td -(6855 // Register definitions for the Intel) 25.284 Tj -0 -11.7818 Td -(6856 // 8253/8254/82C54 Programmable Interval Timer \(PIT\).) 34.916 Tj -0 -13.0909 Td -(6857 ) 3.01 Tj -0 -14.4 Td -(6858 #define IO_TIMER1 0x040 // 8253 Timer #1) 36.722 Tj -0 -15.7091 Td -(6859 #define IO_TIMER2 0x048 // 8253 Timer #2 \(EISA only\)) 43.946 Tj -0 -17.0182 Td -(6860 ) 3.01 Tj -0 -18.3273 Td -(6861 // Frequency of all three count-down timers; \(TIMER_FREQ/freq\) is the) 44.548 Tj -0 -19.6364 Td -(6862 // appropriate count to generate a frequency of freq hz.) 36.722 Tj -0 -20.9455 Td -(6863 ) 3.01 Tj -0 -22.2545 Td -(6864 #define TIMER_FREQ 1193182) 21.672 Tj -0 -23.5636 Td -(6865 #define TIMER_DIV\(x\) \(\(TIMER_FREQ+\(x\)/2\)/\(x\)\)) 31.906 Tj -0 -24.8727 Td -(6866 ) 3.01 Tj -0 -26.1818 Td -(6867 #define TIMER_CNTR0 \(IO_TIMER1 + 0\) // timer 0 counter port) 40.936 Tj -0 -27.4909 Td -(6868 #define TIMER_CNTR1 \(IO_TIMER1 + 1\) // timer 1 counter port) 40.936 Tj -0 -28.8 Td -(6869 #define TIMER_CNTR2 \(IO_TIMER1 + 2\) // timer 2 counter port) 40.936 Tj -0 -30.1091 Td -(6870 #define TIMER_MODE \(IO_TIMER1 + 3\) // timer mode port) 37.926 Tj -0 -31.4182 Td -(6871 #define TIMER_SEL0 0x00 // select counter 0) 33.712 Tj -0 -32.7273 Td -(6872 #define TIMER_SEL1 0x40 // select counter 1) 33.712 Tj -0 -34.0364 Td -(6873 #define TIMER_SEL2 0x80 // select counter 2) 33.712 Tj -0 -35.3454 Td -(6874 #define TIMER_INTTC 0x00 // mode 0, intr on terminal cnt) 40.936 Tj -0 -36.6545 Td -(6875 #define TIMER_ONESHOT 0x02 // mode 1, one shot) 33.712 Tj -0 -37.9636 Td -(6876 #define TIMER_RATEGEN 0x04 // mode 2, rate generator) 37.324 Tj -0 -39.2727 Td -(6877 #define TIMER_SQWAVE 0x06 // mode 3, square wave) 35.518 Tj -0 -40.5818 Td -(6878 #define TIMER_SWSTROBE 0x08 // mode 4, s/w triggered strobe) 40.936 Tj -0 -41.8909 Td -(6879 #define TIMER_HWSTROBE 0x0a // mode 5, h/w triggered strobe) 40.936 Tj -0 -43.2 Td -(6880 #define TIMER_LATCH 0x00 // latch counter for reading) 39.13 Tj -0 -44.5091 Td -(6881 #define TIMER_LSB 0x10 // r/w counter LSB) 33.11 Tj -0 -45.8182 Td -(6882 #define TIMER_MSB 0x20 // r/w counter MSB) 33.11 Tj -0 -47.1272 Td -(6883 #define TIMER_16BIT 0x30 // r/w counter 16 bits, LSB first) 42.14 Tj -0 -48.4363 Td -(6884 #define TIMER_BCD 0x01 // count in BCD) 31.304 Tj -0 -49.7454 Td -(6885 ) 3.01 Tj -0 -51.0545 Td -(6886 void) 5.418 Tj -0 -52.3636 Td -(6887 pit8253_timerinit\(void\)) 16.856 Tj -0 -53.6727 Td -(6888 {) 3.612 Tj -0 -54.9818 Td -(6889 // initialize 8253 clock to interrupt 100 times/sec) 34.916 Tj -0 -56.2909 Td -(6890 outb\(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT\);) 39.732 Tj -0 -57.6 Td -(6891 outb\(IO_TIMER1, TIMER_DIV\(100\) % 256\);) 27.09 Tj -0 -58.9091 Td -(6892 outb\(IO_TIMER1, TIMER_DIV\(100\) / 256\);) 27.09 Tj -0 -60.2181 Td -(6893 irq_enable\(IRQ_TIMER\);) 17.458 Tj -0 -61.5272 Td -(6894 }) 3.612 Tj -0 -62.8363 Td -(6895 ) 3.01 Tj -0 -64.1454 Td -(6896 ) 3.01 Tj -0 -65.4545 Td -(6897 ) 3.01 Tj -0 -66.7636 Td -(6898 ) 3.01 Tj -0 -68.0727 Td -(6899 ) 3.01 Tj -0 -72 Td -(Sheet 68) 4.816 Tj +/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 @@ -20914,5 +23456,5 @@ pdfEndPage %%Trailer end %%DocumentSuppliedResources: -%%+ font LTWFJF+OurCharSet +%%+ font LucidaSans-Typewriter83 %%EOF