%!PS-Adobe-3.0
%%Creator: xpdf/pdftops 3.00
%%LanguageLevel: 2
%%DocumentSuppliedResources: (atend)
%%DocumentMedia: plain 612 792 0 () ()
%%BoundingBox: 0 0 612 792
%%Pages: 75
%%EndComments
%%BeginDefaults
%%PageMedia: plain
%%EndDefaults
%%BeginProlog
%%BeginResource: procset xpdf 3.00 0
/xpdf 75 dict def xpdf begin
% PDF special state
/pdfDictSize 15 def
/pdfSetup {
  3 1 roll 2 array astore
  /setpagedevice where {
    pop 3 dict begin
      /PageSize exch def
      /ImagingBBox null def
      /Policies 1 dict dup begin /PageSize 3 def end def
      { /Duplex true def } if
    currentdict end setpagedevice
  } {
    pop pop
  } ifelse
} def
/pdfStartPage {
  pdfDictSize dict begin
  /pdfFill [0] def
  /pdfStroke [0] def
  /pdfLastFill false def
  /pdfLastStroke false def
  /pdfTextMat [1 0 0 1 0 0] def
  /pdfFontSize 0 def
  /pdfCharSpacing 0 def
  /pdfTextRender 0 def
  /pdfTextRise 0 def
  /pdfWordSpacing 0 def
  /pdfHorizScaling 1 def
  /pdfTextClipPath [] def
} def
/pdfEndPage { end } def
% 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
/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
    /pdfLastFill true def /pdfLastStroke false def
  } if
} def
% build a font
/pdfMakeFont {
  4 3 roll findfont
  4 2 roll matrix scale makefont
  dup length dict begin
    { 1 index /FID ne { def } { pop pop } ifelse } forall
    /Encoding exch def
    currentdict
  end
  definefont pop
} def
/pdfMakeFont16 {
  exch findfont
  dup length dict begin
    { 1 index /FID ne { def } { pop pop } ifelse } forall
    /WMode exch def
    currentdict
  end
  definefont pop
} def
/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
/cm { concat } def
/d { setdash } def
/i { setflat } def
/j { setlinejoin } def
/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
/c { curveto } def
/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
      neg 0 rlineto closepath } def
/h { closepath } def
% path painting operators
/S { sCol stroke } def
/Sf { fCol stroke } def
/f { fCol fill } def
/f* { fCol eofill } def
% clipping operators
/W { clip newpath } def
/W* { eoclip newpath } def
% text state operators
/Tc { /pdfCharSpacing exch def } def
/Tf { dup /pdfFontSize exch def
      dup pdfHorizScaling mul exch matrix scale
      pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put
      exch findfont exch makefont setfont } def
/Tr { /pdfTextRender exch def } def
/Ts { /pdfTextRise exch def } def
/Tw { /pdfWordSpacing exch def } def
/Tz { /pdfHorizScaling exch def } def
% text positioning operators
/Td { pdfTextMat transform moveto } def
/Tm { /pdfTextMat exch def } def
% text string operators
/cshow where {
  pop
  /cshow2 {
    dup {
      pop pop
      1 string dup 0 3 index put 3 index exec
    } exch cshow
    pop pop
  } def
}{
  /cshow2 {
    currentfont /FontType get 0 eq {
      0 2 2 index length 1 sub {
        2 copy get exch 1 add 2 index exch get
        2 copy exch 256 mul add
        2 string dup 0 6 5 roll put dup 1 5 4 roll put
        3 index exec
      } for
    } {
      dup {
        1 string dup 0 3 index put 3 index exec
      } forall
    } ifelse
    pop pop
  } def
} ifelse
/awcp {
  exch {
    false charpath
    5 index 5 index rmoveto
    6 index eq { 7 index 7 index rmoveto } if
  } exch cshow2
  6 {pop} repeat
} def
/Tj {
  fCol
  1 index stringwidth pdfTextMat idtransform pop
  sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse
  pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
  4 3 roll pdfCharSpacing pdfHorizScaling mul add 0
  pdfTextMat dtransform
  6 5 roll Tj1
} def
/Tj16 {
  fCol
  2 index stringwidth pdfTextMat idtransform pop
  sub exch div
  pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32
  4 3 roll pdfCharSpacing pdfHorizScaling mul add 0
  pdfTextMat dtransform
  6 5 roll Tj1
} def
/Tj16V {
  fCol
  2 index stringwidth pdfTextMat idtransform exch pop
  sub exch div
  0 pdfWordSpacing pdfTextMat dtransform 32
  4 3 roll pdfCharSpacing add 0 exch
  pdfTextMat dtransform
  6 5 roll Tj1
} def
/Tj1 {
  0 pdfTextRise pdfTextMat dtransform rmoveto
  currentpoint 8 2 roll
  pdfTextRender 1 and 0 eq {
    6 copy awidthshow
  } if
  pdfTextRender 3 and dup 1 eq exch 2 eq or {
    7 index 7 index moveto
    6 copy
    currentfont /FontType get 3 eq { fCol } { sCol } ifelse
    false awcp currentpoint stroke moveto
  } if
  pdfTextRender 4 and 0 ne {
    8 6 roll moveto
    false awcp
    /pdfTextClipPath [ pdfTextClipPath aload pop
      {/moveto cvx}
      {/lineto cvx}
      {/curveto cvx}
      {/closepath cvx}
    pathforall ] def
    currentpoint newpath moveto
  } {
    8 {pop} repeat
  } ifelse
  0 pdfTextRise neg pdfTextMat dtransform rmoveto
} def
/TJm { pdfFontSize 0.001 mul mul neg 0
       pdfTextMat dtransform rmoveto } def
/TJmV { pdfFontSize 0.001 mul mul neg 0 exch
        pdfTextMat dtransform rmoveto } def
/Tclip { pdfTextClipPath cvx exec clip newpath
         /pdfTextClipPath [] def } def
% Level 2 image operators
/pdfImBuf 100 string def
/pdfIm {
  image
  { currentfile pdfImBuf readline
    not { pop exit } if
    (%-EOD-) eq { exit } if } loop
} def
/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
} def
%%EndResource
%%EndProlog
%%BeginSetup
xpdf begin
%%BeginResource: font LTWFJF+OurCharSet
%!FontType1-1.0: LTWFJF+OurCharSet
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
/ItalicAngle 0 def
/UnderlinePosition -100 def
/UnderlineThickness 50 def
end readonly def
/FontName /LTWFJF+OurCharSet 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
/StrokeWidth 0 def
/Encoding 256 array
0 1 255 {1 index exch /.notdef put} for
dup 32 /space put
dup 33 /exclam put
dup 34 /quotedbl put
dup 35 /numbersign put
dup 36 /dollar put
dup 37 /percent put
dup 38 /ampersand put
dup 39 /quoteright put
dup 40 /parenleft put
dup 41 /parenright put
dup 42 /asterisk put
dup 43 /plus put
dup 44 /comma put
dup 45 /minus put
dup 46 /period put
dup 47 /slash put
dup 48 /zero put
dup 49 /one put
dup 50 /two put
dup 51 /three put
dup 52 /four put
dup 53 /five put
dup 54 /six put
dup 55 /seven put
dup 56 /eight put
dup 57 /nine put
dup 58 /colon put
dup 59 /semicolon put
dup 60 /less put
dup 61 /equal put
dup 62 /greater put
dup 63 /question put
dup 64 /at put
dup 65 /A put
dup 66 /B put
dup 67 /C put
dup 68 /D put
dup 69 /E put
dup 70 /F put
dup 71 /G put
dup 72 /H put
dup 73 /I put
dup 74 /J put
dup 75 /K put
dup 76 /L put
dup 77 /M put
dup 78 /N put
dup 79 /O put
dup 80 /P put
dup 81 /Q put
dup 82 /R put
dup 83 /S put
dup 84 /T put
dup 85 /U put
dup 86 /V put
dup 87 /W put
dup 88 /X put
dup 89 /Y put
dup 90 /Z put
dup 91 /bracketleft put
dup 92 /backslash put
dup 93 /bracketright put
dup 94 /asciicircum put
dup 95 /underscore put
dup 96 /quoteleft put
dup 97 /a put
dup 98 /b put
dup 99 /c put
dup 100 /d put
dup 101 /e put
dup 102 /f put
dup 103 /g put
dup 104 /h put
dup 105 /i put
dup 106 /j put
dup 107 /k put
dup 108 /l put
dup 109 /m put
dup 110 /n put
dup 111 /o put
dup 112 /p put
dup 113 /q put
dup 114 /r put
dup 115 /s put
dup 116 /t put
dup 117 /u put
dup 118 /v put
dup 119 /w put
dup 120 /x put
dup 121 /y put
dup 122 /z put
dup 123 /braceleft put
dup 124 /bar put
dup 125 /braceright put
dup 126 /asciitilde put
readonly def
currentdict end
currentfile eexec
5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62
BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68
368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79
BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97
1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B
1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE
7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF5
C2A9054AD59AE4D5522D8745045620C9C40EAB675A6FE53511D83C04968F37DE
389C3A7A551DC79580FF1B382205C5951A9F8E7B6CEF33E027D608C14A394033
1E603A09B3061B66BB71AC1D2A232B5F2BC9481D7D44F334ACCBBF6538A439A3
FE8DA1ABE05931A20F8FC365A0F90C9A22578FEBDD03E4201D2887923DD20ED9
2F8F50AA500DE6414F5521ACCBBA45FBD55A4882C7485B52146BD36775948914
F8D5FB4C38AFAA25CC8946C7A7DBA010B186D6B5B07DA514976B3CC03535B838
7B3B0BE3D2A1813A3B406846433DF6235D79BA455E54E35184F42053C1FB0105
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
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
cleartomark
%%EndResource
/F10_0 /LTWFJF+OurCharSet 1 1
[ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
  /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
  /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
  /parenleft/parenright/asterisk/plus/comma/minus/period/slash
  /zero/one/two/three/four/five/six/seven
  /eight/nine/colon/semicolon/less/equal/greater/question
  /at/A/B/C/D/E/F/G
  /H/I/J/K/L/M/N/O
  /P/Q/R/S/T/U/V/W
  /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore
  /quoteleft/a/b/c/d/e/f/g
  /h/i/j/k/l/m/n/o
  /p/q/r/s/t/u/v/w
  /x/y/z/braceleft/bar/braceright/asciitilde/.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]
pdfMakeFont
612 792 false pdfSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 2 2
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 3 3
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 4 4
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 5 5
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 6 6
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 7 7
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 8 8
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 9 9
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 10 10
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 11 11
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 12 12
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 13 13
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 14 14
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 15 15
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 16 16
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 17 17
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 18 18
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 19 19
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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; i<NCPU; i++\)) 16.856 Tj
0 -47.1272 Td
(1233     cpus[i].nlock = 1;) 16.254 Tj
0 -48.4363 Td
(1234 ) 3.01 Tj
0 -49.7454 Td
(1235   mp_init\(\); // collect info about this machine) 31.304 Tj
0 -51.0545 Td
(1236   bcpu = mp_bcpu\(\);) 14.448 Tj
0 -52.3636 Td
(1237 ) 3.01 Tj
0 -53.6727 Td
(1238   // switch to bootstrap processor's stack) 28.294 Tj
0 -54.9818 Td
(1239   asm volatile\("movl %0, %%esp" : : "r" \(cpus[0].mpstack + MPSTACK - 32\)\);) 47.558 Tj
0 -56.2909 Td
(1240   asm volatile\("movl %0, %%ebp" : : "r" \(cpus[0].mpstack + MPSTACK\)\);) 44.548 Tj
0 -57.6 Td
(1241 ) 3.01 Tj
0 -58.9091 Td
(1242   lapic_init\(bcpu\);) 14.448 Tj
0 -60.2181 Td
(1243 ) 3.01 Tj
0 -61.5272 Td
(1244   cprintf\("\\ncpu%d: starting xv6\\n\\n", cpu\(\)\);) 30.702 Tj
0 -62.8363 Td
(1245 ) 3.01 Tj
0 -64.1454 Td
(1246 ) 3.01 Tj
0 -65.4545 Td
(1247 ) 3.01 Tj
0 -66.7636 Td
(1248 ) 3.01 Tj
0 -68.0727 Td
(1249 ) 3.01 Tj
0 -72 Td
(Sheet 12) 4.816 Tj
Q
Q
q
180 500 5760 3460 re
W
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 Td
/F10_0 1 Tf
(Sep  8 11:37 2006  xv6/main.c  Page 2) 22.274 Tj
0 -3.92728 Td
(1250   pinit\(\); // process table) 19.264 Tj
0 -5.23637 Td
(1251   binit\(\); // buffer cache) 18.662 Tj
0 -6.54546 Td
(1252   pic_init\(\);) 10.836 Tj
0 -7.85455 Td
(1253   ioapic_init\(\);) 12.642 Tj
0 -9.16364 Td
(1254   kinit\(\); // physical memory allocator) 26.488 Tj
0 -10.4727 Td
(1255   tvinit\(\); // trap vectors) 19.264 Tj
0 -11.7818 Td
(1256   idtinit\(\); // this CPU's interrupt descriptor table) 34.916 Tj
0 -13.0909 Td
(1257   fileinit\(\);) 10.836 Tj
0 -14.4 Td
(1258   iinit\(\); // i-node table) 18.662 Tj
0 -15.7091 Td
(1259 ) 3.01 Tj
0 -17.0182 Td
(1260   // initialize process 0) 18.06 Tj
0 -18.3273 Td
(1261   p = &proc[0];) 12.04 Tj
0 -19.6364 Td
(1262   p->state = 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 20 20
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 21 21
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 22 22
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 23 23
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 24 24
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 25 25
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 26 26
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 27 27
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 28 28
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 29 29
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 30 30
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 31 31
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 32 32
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 33 33
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 34 34
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 35 35
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 36 36
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 37 37
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 38 38
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 39 39
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 40 40
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 41 41
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 42 42
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 43 43
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 44 44
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 45 45
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 46 46
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 47 47
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 48 48
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 49 49
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 50 50
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 51 51
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 52 52
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 53 53
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 54 54
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 55 55
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 56 56
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 57 57
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 Td
/F10_0 1 Tf
(Sep  8 11:37 2006  xv6/file.c  Page 4) 22.274 Tj
0 -3.92728 Td
(5050 // Increment ref count for file f.) 23.478 Tj
0 -5.23637 Td
(5051 void) 5.418 Tj
0 -6.54546 Td
(5052 fileincref\(struct file *f\)) 18.662 Tj
0 -7.85455 Td
(5053 {) 3.612 Tj
0 -9.16364 Td
(5054   acquire\(&file_table_lock\);) 19.866 Tj
0 -10.4727 Td
(5055   if\(f->ref < 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 58 58
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 59 59
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 60 60
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 61 61
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 62 62
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 Td
/F10_0 1 Tf
(Sep  8 11:37 2006  xv6/sysfile.c  Page 10) 24.682 Tj
0 -3.92728 Td
(5550   p1 = sp + 12;) 12.04 Tj
0 -5.23637 Td
(5551   p2 = sp + 12 + \(nargs + 1\) * 4;) 22.876 Tj
0 -6.54546 Td
(5552   for\(i = 0; i < nargs; i++\){) 20.468 Tj
0 -7.85455 Td
(5553     fetchint\(cp, argv + 4*i, \(int*\)&ap\);) 27.09 Tj
0 -9.16364 Td
(5554     len = fetchstr\(cp, ap, &s\);) 21.672 Tj
0 -10.4727 Td
(5555     memmove\(mem + p2, s, len + 1\);) 23.478 Tj
0 -11.7818 Td
(5556     *\(uint*\)\(mem + p1\) = p2;) 19.866 Tj
0 -13.0909 Td
(5557     p1 += 4;) 10.234 Tj
0 -14.4 Td
(5558     p2 += len + 1;) 13.846 Tj
0 -15.7091 Td
(5559   }) 4.816 Tj
0 -17.0182 Td
(5560   *\(uint*\)\(mem + p1\) = 0;) 18.06 Tj
0 -18.3273 Td
(5561 ) 3.01 Tj
0 -19.6364 Td
(5562   // commit to the new image.) 20.468 Tj
0 -20.9455 Td
(5563   kfree\(cp->mem, 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 63 63
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 64 64
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 65 65
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 66 66
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 Td
/F10_0 1 Tf
(Sep  8 11:37 2006  xv6/lapic.c  Page 1) 22.876 Tj
0 -3.92728 Td
(5950 #include "types.h") 13.846 Tj
0 -5.23637 Td
(5951 #include "mp.h") 12.04 Tj
0 -6.54546 Td
(5952 #include "defs.h") 13.244 Tj
0 -7.85455 Td
(5953 #include "param.h") 13.846 Tj
0 -9.16364 Td
(5954 #include "x86.h") 12.642 Tj
0 -10.4727 Td
(5955 #include "traps.h") 13.846 Tj
0 -11.7818 Td
(5956 #include "mmu.h") 12.642 Tj
0 -13.0909 Td
(5957 #include "proc.h") 13.244 Tj
0 -14.4 Td
(5958 ) 3.01 Tj
0 -15.7091 Td
(5959 enum {  // Local APIC registers) 21.672 Tj
0 -17.0182 Td
(5960   LAPIC_ID  = 0x0020,   // ID) 20.468 Tj
0 -18.3273 Td
(5961   LAPIC_VER = 0x0030,   // Version) 23.478 Tj
0 -19.6364 Td
(5962   LAPIC_TPR = 0x0080,   // Task Priority) 27.09 Tj
0 -20.9455 Td
(5963   LAPIC_APR = 0x0090,   // Arbitration Priority) 31.304 Tj
0 -22.2545 Td
(5964   LAPIC_PPR = 0x00A0,   // Processor Priority) 30.1 Tj
0 -23.5636 Td
(5965   LAPIC_EOI = 0x00B0,   // EOI) 21.07 Tj
0 -24.8727 Td
(5966   LAPIC_LDR = 0x00D0,   // Logical Destination) 30.702 Tj
0 -26.1818 Td
(5967   LAPIC_DFR = 0x00E0,   // Destination Format) 30.1 Tj
0 -27.4909 Td
(5968   LAPIC_SVR = 0x00F0,   // Spurious Interrupt Vector) 34.314 Tj
0 -28.8 Td
(5969   LAPIC_ISR = 0x0100,   // Interrupt Status \(8 registers\)) 37.324 Tj
0 -30.1091 Td
(5970   LAPIC_TMR = 0x0180,   // Trigger Mode \(8 registers\)) 34.916 Tj
0 -31.4182 Td
(5971   LAPIC_IRR = 0x0200,   // Interrupt Request \(8 registers\)) 37.926 Tj
0 -32.7273 Td
(5972   LAPIC_ESR = 0x0280,   // Error Status) 26.488 Tj
0 -34.0364 Td
(5973   LAPIC_ICRLO = 0x0300, // Interrupt Command) 29.498 Tj
0 -35.3454 Td
(5974   LAPIC_ICRHI = 0x0310, // Interrupt Command [63:32]) 34.314 Tj
0 -36.6545 Td
(5975   LAPIC_TIMER = 0x0320, // Local Vector Table 0 \(TIMER\)) 36.12 Tj
0 -37.9636 Td
(5976   LAPIC_PCINT = 0x0340, // Performance Counter LVT) 33.11 Tj
0 -39.2727 Td
(5977   LAPIC_LINT0 = 0x0350, // Local Vector Table 1 \(LINT0\)) 36.12 Tj
0 -40.5818 Td
(5978   LAPIC_LINT1 = 0x0360, // Local Vector Table 2 \(LINT1\)) 36.12 Tj
0 -41.8909 Td
(5979   LAPIC_ERROR = 0x0370, // Local Vector Table 3 \(ERROR\)) 36.12 Tj
0 -43.2 Td
(5980   LAPIC_TICR = 0x0380,  // Timer Initial Count) 30.702 Tj
0 -44.5091 Td
(5981   LAPIC_TCCR = 0x0390,  // Timer Current Count) 30.702 Tj
0 -45.8182 Td
(5982   LAPIC_TDCR = 0x03E0,  // Timer Divide Configuration) 34.916 Tj
0 -47.1272 Td
(5983 };) 4.214 Tj
0 -48.4363 Td
(5984 ) 3.01 Tj
0 -49.7454 Td
(5985 enum {  // LAPIC_SVR) 15.05 Tj
0 -51.0545 Td
(5986   LAPIC_ENABLE  = 0x00000100,   // Unit Enable) 30.702 Tj
0 -52.3636 Td
(5987   LAPIC_FOCUS   = 0x00000200,   // Focus Processor Checking Disable) 43.344 Tj
0 -53.6727 Td
(5988 };) 4.214 Tj
0 -54.9818 Td
(5989 ) 3.01 Tj
0 -56.2909 Td
(5990 ) 3.01 Tj
0 -57.6 Td
(5991 ) 3.01 Tj
0 -58.9091 Td
(5992 ) 3.01 Tj
0 -60.2181 Td
(5993 ) 3.01 Tj
0 -61.5272 Td
(5994 ) 3.01 Tj
0 -62.8363 Td
(5995 ) 3.01 Tj
0 -64.1454 Td
(5996 ) 3.01 Tj
0 -65.4545 Td
(5997 ) 3.01 Tj
0 -66.7636 Td
(5998 ) 3.01 Tj
0 -68.0727 Td
(5999 ) 3.01 Tj
0 -72 Td
(Sheet 59) 4.816 Tj
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 67 67
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 Td
/F10_0 1 Tf
(Sep  8 11:37 2006  xv6/lapic.c  Page 2) 22.876 Tj
0 -3.92728 Td
(6000 enum {  // LAPIC_ICRLO) 16.254 Tj
0 -5.23637 Td
(6001   // [14] IPI Trigger Mode Level \(RW\)) 25.284 Tj
0 -6.54546 Td
(6002   LAPIC_DEASSERT = 0x00000000,  // Deassert level-sensitive interrupt) 44.548 Tj
0 -7.85455 Td
(6003   LAPIC_ASSERT  = 0x00004000,   // Assert level-sensitive interrupt) 43.344 Tj
0 -9.16364 Td
(6004 ) 3.01 Tj
0 -10.4727 Td
(6005   // [17:16] Remote Read Status) 21.672 Tj
0 -11.7818 Td
(6006   LAPIC_INVALID = 0x00000000,   // Invalid) 28.294 Tj
0 -13.0909 Td
(6007   LAPIC_WAIT    = 0x00010000,   // In-Progress) 30.702 Tj
0 -14.4 Td
(6008   LAPIC_VALID   = 0x00020000,   // Valid) 27.09 Tj
0 -15.7091 Td
(6009 ) 3.01 Tj
0 -17.0182 Td
(6010   // [19:18] Destination Shorthand) 23.478 Tj
0 -18.3273 Td
(6011   LAPIC_FIELD   = 0x00000000,   // No shorthand) 31.304 Tj
0 -19.6364 Td
(6012   LAPIC_SELF    = 0x00040000,   // Self is single destination) 39.732 Tj
0 -20.9455 Td
(6013   LAPIC_ALLINC  = 0x00080000,   // All including self) 34.916 Tj
0 -22.2545 Td
(6014   LAPIC_ALLEXC  = 0x000C0000,   // All Excluding self) 34.916 Tj
0 -23.5636 Td
(6015 };) 4.214 Tj
0 -24.8727 Td
(6016 ) 3.01 Tj
0 -26.1818 Td
(6017 enum {  // LAPIC_ESR) 15.05 Tj
0 -27.4909 Td
(6018   LAPIC_SENDCS  = 0x00000001,     // Send CS Error) 33.11 Tj
0 -28.8 Td
(6019   LAPIC_RCVCS   = 0x00000002,     // Receive CS Error) 34.916 Tj
0 -30.1091 Td
(6020   LAPIC_SENDACCEPT = 0x00000004,  // Send Accept Error) 35.518 Tj
0 -31.4182 Td
(6021   LAPIC_RCVACCEPT = 0x00000008,   // Receive Accept Error) 37.324 Tj
0 -32.7273 Td
(6022   LAPIC_SENDVECTOR = 0x00000020,  // Send Illegal Vector) 36.722 Tj
0 -34.0364 Td
(6023   LAPIC_RCVVECTOR = 0x00000040,   // Receive Illegal Vector) 38.528 Tj
0 -35.3454 Td
(6024   LAPIC_REGISTER = 0x00000080,    // Illegal Register Address) 39.732 Tj
0 -36.6545 Td
(6025 };) 4.214 Tj
0 -37.9636 Td
(6026 ) 3.01 Tj
0 -39.2727 Td
(6027 enum {  // LAPIC_TIMER) 16.254 Tj
0 -40.5818 Td
(6028   // [17] Timer Mode \(RW\)) 18.06 Tj
0 -41.8909 Td
(6029   LAPIC_ONESHOT = 0x00000000,   // One-shot) 28.896 Tj
0 -43.2 Td
(6030   LAPIC_PERIODIC = 0x00020000,  // Periodic) 28.896 Tj
0 -44.5091 Td
(6031 ) 3.01 Tj
0 -45.8182 Td
(6032   // [19:18] Timer Base \(RW\)) 19.866 Tj
0 -47.1272 Td
(6033   LAPIC_CLKIN   = 0x00000000,   // use CLKIN as input) 34.916 Tj
0 -48.4363 Td
(6034   LAPIC_TMBASE  = 0x00040000,   // use TMBASE) 30.1 Tj
0 -49.7454 Td
(6035   LAPIC_DIVIDER = 0x00080000,   // use output of the divider) 39.13 Tj
0 -51.0545 Td
(6036 };) 4.214 Tj
0 -52.3636 Td
(6037 ) 3.01 Tj
0 -53.6727 Td
(6038 enum {  // LAPIC_TDCR) 15.652 Tj
0 -54.9818 Td
(6039   LAPIC_X2 = 0x00000000,        // divide by 2) 30.702 Tj
0 -56.2909 Td
(6040   LAPIC_X4 = 0x00000001,        // divide by 4) 30.702 Tj
0 -57.6 Td
(6041   LAPIC_X8 = 0x00000002,        // divide by 8) 30.702 Tj
0 -58.9091 Td
(6042   LAPIC_X16 = 0x00000003,       // divide by 16) 31.304 Tj
0 -60.2181 Td
(6043   LAPIC_X32 = 0x00000008,       // divide by 32) 31.304 Tj
0 -61.5272 Td
(6044   LAPIC_X64 = 0x00000009,       // divide by 64) 31.304 Tj
0 -62.8363 Td
(6045   LAPIC_X128 = 0x0000000A,      // divide by 128) 31.906 Tj
0 -64.1454 Td
(6046   LAPIC_X1 = 0x0000000B,        // divide by 1) 30.702 Tj
0 -65.4545 Td
(6047 };) 4.214 Tj
0 -66.7636 Td
(6048 ) 3.01 Tj
0 -68.0727 Td
(6049 ) 3.01 Tj
0 -72 Td
(Sheet 60) 4.816 Tj
Q
Q
q
180 500 5760 3460 re
W
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 Td
/F10_0 1 Tf
(Sep  8 11:37 2006  xv6/lapic.c  Page 3) 22.876 Tj
0 -3.92728 Td
(6050 uint *lapicaddr;) 12.642 Tj
0 -5.23637 Td
(6051 ) 3.01 Tj
0 -6.54546 Td
(6052 static int) 9.03 Tj
0 -7.85455 Td
(6053 lapic_read\(int r\)) 13.244 Tj
0 -9.16364 Td
(6054 {) 3.612 Tj
0 -10.4727 Td
(6055   return *\(lapicaddr+\(r/sizeof\(*lapicaddr\)\)\);) 30.1 Tj
0 -11.7818 Td
(6056 }) 3.612 Tj
0 -13.0909 Td
(6057 ) 3.01 Tj
0 -14.4 Td
(6058 static void) 9.632 Tj
0 -15.7091 Td
(6059 lapic_write\(int r, int data\)) 19.866 Tj
0 -17.0182 Td
(6060 {) 3.612 Tj
0 -18.3273 Td
(6061   *\(lapicaddr+\(r/sizeof\(*lapicaddr\)\)\) = data;) 30.1 Tj
0 -19.6364 Td
(6062 }) 3.612 Tj
0 -20.9455 Td
(6063 ) 3.01 Tj
0 -22.2545 Td
(6064 ) 3.01 Tj
0 -23.5636 Td
(6065 void) 5.418 Tj
0 -24.8727 Td
(6066 lapic_timerinit\(void\)) 15.652 Tj
0 -26.1818 Td
(6067 {) 3.612 Tj
0 -27.4909 Td
(6068   if\(!lapicaddr\)) 12.642 Tj
0 -28.8 Td
(6069     return;) 9.632 Tj
0 -30.1091 Td
(6070 ) 3.01 Tj
0 -31.4182 Td
(6071   lapic_write\(LAPIC_TDCR, LAPIC_X1\);) 24.682 Tj
0 -32.7273 Td
(6072   lapic_write\(LAPIC_TIMER, LAPIC_CLKIN | LAPIC_PERIODIC |) 37.324 Tj
0 -34.0364 Td
(6073 ) 3.01 Tj
8.42796 -34.0364 Td
(\(IRQ_OFFSET + IRQ_TIMER\)\);) 15.652 Tj
0 -35.3454 Td
(6074   lapic_write\(LAPIC_TCCR, 10000000\);) 24.682 Tj
0 -36.6545 Td
(6075   lapic_write\(LAPIC_TICR, 10000000\);) 24.682 Tj
0 -37.9636 Td
(6076 }) 3.612 Tj
0 -39.2727 Td
(6077 ) 3.01 Tj
0 -40.5818 Td
(6078 void) 5.418 Tj
0 -41.8909 Td
(6079 lapic_timerintr\(void\)) 15.652 Tj
0 -43.2 Td
(6080 {) 3.612 Tj
0 -44.5091 Td
(6081   if\(lapicaddr\)) 12.04 Tj
0 -45.8182 Td
(6082     lapic_write\(LAPIC_EOI, 0\);) 21.07 Tj
0 -47.1272 Td
(6083 }) 3.612 Tj
0 -48.4363 Td
(6084 ) 3.01 Tj
0 -49.7454 Td
(6085 void) 5.418 Tj
0 -51.0545 Td
(6086 lapic_init\(int c\)) 13.244 Tj
0 -52.3636 Td
(6087 {) 3.612 Tj
0 -53.6727 Td
(6088   uint r, lvt;) 11.438 Tj
0 -54.9818 Td
(6089 ) 3.01 Tj
0 -56.2909 Td
(6090   if\(!lapicaddr\)) 12.642 Tj
0 -57.6 Td
(6091     return;) 9.632 Tj
0 -58.9091 Td
(6092 ) 3.01 Tj
0 -60.2181 Td
(6093   lapic_write\(LAPIC_DFR, 0xFFFFFFFF\);    // Set dst format register) 43.344 Tj
0 -61.5272 Td
(6094   r = \(lapic_read\(LAPIC_ID\)>>24\) & 0xFF; // Read APIC ID) 36.722 Tj
0 -62.8363 Td
(6095   lapic_write\(LAPIC_LDR, \(1<<r\)<<24\);    // Set logical dst register to r) 46.956 Tj
0 -64.1454 Td
(6096   lapic_write\(LAPIC_TPR, 0xFF\);          // No interrupts for now) 42.14 Tj
0 -65.4545 Td
(6097 ) 3.01 Tj
0 -66.7636 Td
(6098   // Enable APIC) 12.642 Tj
0 -68.0727 Td
(6099   lapic_write\(LAPIC_SVR, LAPIC_ENABLE|\(IRQ_OFFSET+IRQ_SPURIOUS\)\);) 42.14 Tj
0 -72 Td
(Sheet 60) 4.816 Tj
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 68 68
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 69 69
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 70 70
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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<<IRQ_SLAVE\);) 36.722 Tj
0 -22.2545 Td
(6314 ) 3.01 Tj
0 -23.5636 Td
(6315 static void) 9.632 Tj
0 -24.8727 Td
(6316 irq_setmask_8259A\(ushort mask\)) 21.07 Tj
0 -26.1818 Td
(6317 {) 3.612 Tj
0 -27.4909 Td
(6318   irq_mask_8259A = mask;) 17.458 Tj
0 -28.8 Td
(6319 ) 3.01 Tj
0 -30.1091 Td
(6320   outb\(IO_PIC1+1, \(char\)mask\);) 21.07 Tj
0 -31.4182 Td
(6321   outb\(IO_PIC2+1, \(char\)\(mask >> 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<<irq\)\);) 31.906 Tj
0 -40.5818 Td
(6328 }) 3.612 Tj
0 -41.8909 Td
(6329 ) 3.01 Tj
0 -43.2 Td
(6330 // Initialize the 8259A interrupt controllers.) 30.702 Tj
0 -44.5091 Td
(6331 void) 5.418 Tj
0 -45.8182 Td
(6332 pic_init\(void\)) 11.438 Tj
0 -47.1272 Td
(6333 {) 3.612 Tj
0 -48.4363 Td
(6334   // mask all interrupts) 17.458 Tj
0 -49.7454 Td
(6335   outb\(IO_PIC1+1, 0xFF\);) 17.458 Tj
0 -51.0545 Td
(6336   outb\(IO_PIC2+1, 0xFF\);) 17.458 Tj
0 -52.3636 Td
(6337 ) 3.01 Tj
0 -53.6727 Td
(6338   // Set up master \(8259A-1\)) 19.866 Tj
0 -54.9818 Td
(6339 ) 3.01 Tj
0 -56.2909 Td
(6340   // ICW1:  0001g0hi) 15.05 Tj
0 -57.6 Td
(6341   //    g:  0 = edge triggering, 1 = level triggering) 34.916 Tj
0 -58.9091 Td
(6342   //    h:  0 = cascaded PICs, 1 = master only) 30.702 Tj
0 -60.2181 Td
(6343   //    i:  0 = no ICW4, 1 = ICW4 required) 28.294 Tj
0 -61.5272 Td
(6344   outb\(IO_PIC1, 0x11\);) 16.254 Tj
0 -62.8363 Td
(6345 ) 3.01 Tj
0 -64.1454 Td
(6346   // ICW2:  Vector offset) 18.06 Tj
0 -65.4545 Td
(6347   outb\(IO_PIC1+1, IRQ_OFFSET\);) 21.07 Tj
0 -66.7636 Td
(6348 ) 3.01 Tj
0 -68.0727 Td
(6349 ) 3.01 Tj
0 -72 Td
(Sheet 63) 4.816 Tj
Q
Q
q
180 500 5760 3460 re
W
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 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<<IRQ_SLAVE\);) 22.274 Tj
0 -7.85455 Td
(6353 ) 3.01 Tj
0 -9.16364 Td
(6354   // ICW4:  000nbmap) 15.05 Tj
0 -10.4727 Td
(6355   //    n:  1 = special fully nested mode) 27.692 Tj
0 -11.7818 Td
(6356   //    b:  1 = buffered mode) 20.468 Tj
0 -13.0909 Td
(6357   //    m:  0 = slave PIC, 1 = master PIC) 27.692 Tj
0 -14.4 Td
(6358   //      \(ignored when b is 0, as the master/slave role) 36.722 Tj
0 -15.7091 Td
(6359   //      can be hardwired\).) 19.866 Tj
0 -17.0182 Td
(6360   //    a:  1 = Automatic EOI mode) 23.478 Tj
0 -18.3273 Td
(6361   //    p:  0 = MCS-80/85 mode, 1 = intel x86 mode) 33.11 Tj
0 -19.6364 Td
(6362   outb\(IO_PIC1+1, 0x3\);) 16.856 Tj
0 -20.9455 Td
(6363 ) 3.01 Tj
0 -22.2545 Td
(6364   // Set up slave \(8259A-2\)) 19.264 Tj
0 -23.5636 Td
(6365   outb\(IO_PIC2, 0x11\);                  // ICW1) 31.304 Tj
0 -24.8727 Td
(6366   outb\(IO_PIC2+1, IRQ_OFFSET + 8\);      // ICW2) 31.304 Tj
0 -26.1818 Td
(6367   outb\(IO_PIC2+1, IRQ_SLAVE\);           // ICW3) 31.304 Tj
0 -27.4909 Td
(6368   // NB Automatic EOI mode doesn't tend to work on the slave.) 39.732 Tj
0 -28.8 Td
(6369   // Linux source code says it's "to be investigated".) 35.518 Tj
0 -30.1091 Td
(6370   outb\(IO_PIC2+1, 0x3\);                 // ICW4) 31.304 Tj
0 -31.4182 Td
(6371 ) 3.01 Tj
0 -32.7273 Td
(6372   // OCW3:  0ef01prs) 15.05 Tj
0 -34.0364 Td
(6373   //   ef:  0x = NOP, 10 = clear specific mask, 11 = set specific mask) 45.15 Tj
0 -35.3454 Td
(6374   //    p:  0 = no polling, 1 = polling mode) 29.498 Tj
0 -36.6545 Td
(6375   //   rs:  0x = NOP, 10 = read IRR, 11 = read ISR) 33.11 Tj
0 -37.9636 Td
(6376   outb\(IO_PIC1, 0x68\);             // clear specific mask) 37.324 Tj
0 -39.2727 Td
(6377   outb\(IO_PIC1, 0x0a\);             // read IRR by default) 37.324 Tj
0 -40.5818 Td
(6378 ) 3.01 Tj
0 -41.8909 Td
(6379   outb\(IO_PIC2, 0x68\);             // OCW3) 28.294 Tj
0 -43.2 Td
(6380   outb\(IO_PIC2, 0x0a\);             // OCW3) 28.294 Tj
0 -44.5091 Td
(6381 ) 3.01 Tj
0 -45.8182 Td
(6382   if\(irq_mask_8259A != 0xFFFF\)) 21.07 Tj
0 -47.1272 Td
(6383     irq_setmask_8259A\(irq_mask_8259A\);) 25.886 Tj
0 -48.4363 Td
(6384 }) 3.612 Tj
0 -49.7454 Td
(6385 ) 3.01 Tj
0 -51.0545 Td
(6386 ) 3.01 Tj
0 -52.3636 Td
(6387 ) 3.01 Tj
0 -53.6727 Td
(6388 ) 3.01 Tj
0 -54.9818 Td
(6389 ) 3.01 Tj
0 -56.2909 Td
(6390 ) 3.01 Tj
0 -57.6 Td
(6391 ) 3.01 Tj
0 -58.9091 Td
(6392 ) 3.01 Tj
0 -60.2181 Td
(6393 ) 3.01 Tj
0 -61.5272 Td
(6394 ) 3.01 Tj
0 -62.8363 Td
(6395 ) 3.01 Tj
0 -64.1454 Td
(6396 ) 3.01 Tj
0 -65.4545 Td
(6397 ) 3.01 Tj
0 -66.7636 Td
(6398 ) 3.01 Tj
0 -68.0727 Td
(6399 ) 3.01 Tj
0 -72 Td
(Sheet 63) 4.816 Tj
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 71 71
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 Td
/F10_0 1 Tf
(Sep  8 11:37 2006  xv6/console.c  Page 1) 24.08 Tj
0 -3.92728 Td
(6400 #include "types.h") 13.846 Tj
0 -5.23637 Td
(6401 #include "x86.h") 12.642 Tj
0 -6.54546 Td
(6402 #include "traps.h") 13.846 Tj
0 -7.85455 Td
(6403 #include "defs.h") 13.244 Tj
0 -9.16364 Td
(6404 #include "spinlock.h") 15.652 Tj
0 -10.4727 Td
(6405 #include "dev.h") 12.642 Tj
0 -11.7818 Td
(6406 #include "param.h") 13.846 Tj
0 -13.0909 Td
(6407 #include "mmu.h") 12.642 Tj
0 -14.4 Td
(6408 ) 3.01 Tj
0 -15.7091 Td
(6409 struct spinlock console_lock;) 20.468 Tj
0 -17.0182 Td
(6410 int panicked = 0;) 13.244 Tj
0 -18.3273 Td
(6411 int use_console_lock = 0;) 18.06 Tj
0 -19.6364 Td
(6412 ) 3.01 Tj
0 -20.9455 Td
(6413 // Copy console output to parallel port, which you can tell) 38.528 Tj
0 -22.2545 Td
(6414 // .bochsrc to copy to the stdout:) 23.478 Tj
0 -23.5636 Td
(6415 //   parport1: enabled=1, file="/dev/stdout") 29.498 Tj
0 -24.8727 Td
(6416 static void) 9.632 Tj
0 -26.1818 Td
(6417 lpt_putc\(int c\)) 12.04 Tj
0 -27.4909 Td
(6418 {) 3.612 Tj
0 -28.8 Td
(6419   int i;) 7.826 Tj
0 -30.1091 Td
(6420 ) 3.01 Tj
0 -31.4182 Td
(6421   for\(i = 0; !\(inb\(0x378+1\) & 0x80\) && i < 12800; i++\)) 35.518 Tj
0 -32.7273 Td
(6422     ;) 6.02 Tj
0 -34.0364 Td
(6423   outb\(0x378+0, c\);) 14.448 Tj
0 -35.3454 Td
(6424   outb\(0x378+2, 0x08|0x04|0x01\);) 22.274 Tj
0 -36.6545 Td
(6425   outb\(0x378+2, 0x08\);) 16.254 Tj
0 -37.9636 Td
(6426 }) 3.612 Tj
0 -39.2727 Td
(6427 ) 3.01 Tj
0 -40.5818 Td
(6428 static void) 9.632 Tj
0 -41.8909 Td
(6429 cons_putc\(int c\)) 12.642 Tj
0 -43.2 Td
(6430 {) 3.612 Tj
0 -44.5091 Td
(6431   int crtport = 0x3d4; // io port of CGA) 27.09 Tj
0 -45.8182 Td
(6432   ushort *crt = \(ushort*\) 0xB8000; // base of CGA memory) 36.722 Tj
0 -47.1272 Td
(6433   int ind;) 9.03 Tj
0 -48.4363 Td
(6434 ) 3.01 Tj
0 -49.7454 Td
(6435   if\(panicked\){) 12.04 Tj
0 -51.0545 Td
(6436     cli\(\);) 9.03 Tj
0 -52.3636 Td
(6437     for\(;;\)) 9.632 Tj
0 -53.6727 Td
(6438       ;) 7.224 Tj
0 -54.9818 Td
(6439   }) 4.816 Tj
0 -56.2909 Td
(6440 ) 3.01 Tj
0 -57.6 Td
(6441   lpt_putc\(c\);) 11.438 Tj
0 -58.9091 Td
(6442 ) 3.01 Tj
0 -60.2181 Td
(6443   // cursor position, 16 bits, col + 80*row) 28.896 Tj
0 -61.5272 Td
(6444   outb\(crtport, 14\);) 15.05 Tj
0 -62.8363 Td
(6445   ind = inb\(crtport + 1\) << 8;) 21.07 Tj
0 -64.1454 Td
(6446   outb\(crtport, 15\);) 15.05 Tj
0 -65.4545 Td
(6447   ind |= inb\(crtport + 1\);) 18.662 Tj
0 -66.7636 Td
(6448 ) 3.01 Tj
0 -68.0727 Td
(6449   c &= 0xff;) 10.234 Tj
0 -72 Td
(Sheet 64) 4.816 Tj
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 72 72
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 73 73
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 74 74
%%BeginPageSetup
%%PageOrientation: Landscape
__tumble pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 75 75
%%BeginPageSetup
%%PageOrientation: Landscape
pdfStartPage
%%EndPageSetup
[] 0 d
1 i
0 j
0 J
10 M
1 w
0 g
0 G
q
q
[0.1 0 0 0.1 0 0] cm
q
Q
q
180 3960 5760 3460 re
W
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 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
Q
Q
q
180 500 5760 3460 re
W
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 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
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Trailer
end
%%DocumentSuppliedResources:
%%+ font LTWFJF+OurCharSet
%%EOF