
рдЗрд╕ рдЧрд░реНрдореА рдореЗрдВ,
рдПрдкрдкреНрд▓рд╛рдореИрдХ рдиреЗ
рдПрдордЖрдЗрдкреАрдПрд╕ рдЕрд╕реЗрдореНрдмрд▓рд░ рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд
рдХрд┐рдпрд╛ ред рдЗрд╕рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ syscall рдХрдорд╛рдВрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдЦрдХ рдиреЗ рдПрдордЖрдЗрдкреАрдПрд╕ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛, рдФрд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рдХрд┐ рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреНрдпрд╛ рд╣реИред рдЙрд╕ рд╕рдордп, рдореИрдВ MIPS рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рдерд╛, рдореИрдВ рд╡реНрдпрд╡рдзрд╛рдиреЛрдВ, рдЕрдкрд╡рд╛рджреЛрдВ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╕реЗ рдирд┐рдкрдЯрддрд╛ рдерд╛ред
рдЕрдм рдЪреВрдВрдХрд┐ рдХреЛрдб рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдФрд░ рдбрд┐рдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ MIPS рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рддрдВрддреНрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдХреЛрдбрд╛рдВрддрд░рдХ рдкрд░ рдЙрд╕ рд▓реЗрдЦ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдЪрдп
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреНрдпрд╛ рд╣реИрдВ, рдФрд░ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрддрд╛ рд╣реИ:
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдЕрдкреАрд▓ рд╣реИред
рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЖрдорддреМрд░ рдкрд░ рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕рдмрд░реВрдЯреАрди рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╕рдмрд░реВрдЯреАрди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдХреЙрд▓ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдПрдХ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкрддреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдореЛрдб (kash Mode) рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдЖрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдЯреЗрдмрд▓ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛, рдмрд╛рдзрд┐рдд рдХрд░рдирд╛ / рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдФрд░ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ред
рдПрдХ рдкреВрд░реНрд╡-рдЬреНрдЮрд╛рдд рдкрддреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡реНрдпреВрдЕрд░ рдХреЗ рдПрдХ рд╕рд░рдгреА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдзрд╛рд░ рдкрддреЗ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг + рдСрдлрд╕реЗрдЯ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣реА рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░, рдЙрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрдорд╛рдВрдб рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рдкрддреЗ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬрдм рдЕрдкрд╡рд╛рдж рдпрд╛ рдмрд╛рд╣рд░реА рд░реБрдХрд╛рд╡рдЯ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЖрдорддреМрд░ рдкрд░ рдЗрди рдЙрдкрдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рд╛рде рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
MIPS рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рдЖрдЗрдП MIPS рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдЗрди рдЙрдкрдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
MIPS рд╕рдВрд╕реНрдХрд░рдг 2 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрд╢рди рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рд╡реЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрддреЗ рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдзрд╛рд░ рдкрддреЗ рдХреЗ рд▓рд┐рдП рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
- рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рдкрддрд╛ рддрдп рдкрддреЗ (0x80000180) рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЖрдХрд╛рд░ 128 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред
- рджреВрд╕рд░реЗ рдореЗрдВ, рдкреНрд░реЛрд╕реЗрд╕рд░ CP0_EBASE рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЖрдХрд╛рд░ 256 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред
рд░реБрдХрд╛рд╡рдЯ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рджреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рд╣реИрдВ: рд╕рд╛рдорд╛рдиреНрдп, рдЬрдм рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдФрд░ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░реБрдХрд╛рд╡рдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрдерд╛рди рд╣реЛрддрд╛ рд╣реИред
рдпреЗ рдореЛрдб MIPS рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╡рд┐рд╢реЗрд╖ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ, рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдпрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
MIPS рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ 0. рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП mfc0 - рдФрд░ рд╡рд┐рд╢реЗрд╖ рдЕрд╕реЗрдВрдмрд▓рд░ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП mtc0 -ред
рд░рдЬрд┐рд╕реНрдЯрд░ рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдпрдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░рдЬрд┐рд╕реНрдЯрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ:
рдирд╛рдо | рд╕реВрдЪреА | рдЪрдпрдирдХрд░реНрддрд╛ | рд╡рд┐рд╡рд░рдг |
---|
CP0_STATUS | 12 | 0 | рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдЭрдВрдбреЗ |
CP0_CAUSE | 13 | 0 | рд░реБрдХрд╛рд╡рдЯ рдХреЗ рдХрд╛рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА |
CP0_EPC | 14 | 0 | рдЙрд╕ рдЖрджреЗрд╢ рдХрд╛ рдкрддрд╛ рдЬреЛ рд╡реНрдпрд╡рдзрд╛рди рдХреЗ рд╕рдордп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рд░рд╣рд╛ рдерд╛ |
CP0_EBASE | 15 | 1 | рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЖрдзрд╛рд░ рдкрддрд╛ |
рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЛрдб рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рдЙрдиреНрд╣реЗрдВ рджреЛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: CP0_STATUS рдФрд░ CP0_CAUSE, рдЬрд┐рдирдореЗрдВ рдирд┐рдореНрди рдкреНрд░рд╛рд░реВрдк рд╣реИрдВред
SP0_STATUS31-28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18-16 | 15-8 | 7 | 6 | 5 | 4-3 | 2 | 1 | 0 |
---|
CU3..CU0 | рдЖрд░рдкреА | рдПрдлрдЖрд░ | рдЖрд░рдИ | рдПрдордПрдХреНрд╕ | PX | BEV | рдЯреАрдПрд╕ | рдПрд╕рдЖрд░ | рдПрдирдПрдордЖрдИ | impl | IM7..IM0 | KX | SX | UX | KSU | ERL | EXL | рдЖрдИрдИ |
CP0_CAUSE31 | 30 | 29-28 | 27 | 26 | 25-24 | 23 | 22 | 21-16 | 15-10 | 9-8 | 7 | 6-2 | 1-0 |
---|
BD | рдЯреАрдЖрдИ | рд╕реАрдИ | рдбреАрд╕реА | рдкреАрд╕реАрдЖрдИ | 0 | рдЪрддреБрд░реНрде | WP | 0 | рдЖрдИрдкреА | рдЖрдИрдкреА | 0 | exCode | 0 |
рд╕реАрдкреАрдпреВ рдЖрд░рдВрднреАрдХрд░рдг
рдореИрдВ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд╣рд▓реЗ рдореЛрдб рдХреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рднреА рдПрдордЖрдЗрдкреА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдорд╛рдиреВрдВрдЧрд╛ред рдЕрдиреНрдп рд╕рднреА рддрд░реАрдХреЗ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЗрд╕ рдореЛрдб рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдерд┐рддрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ BEV рдмрд┐рдЯ рдФрд░ рдХрд╛рд░рдг рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдмрд┐рдЯ IV рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╕реА рдХреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ
static int mips_exception_init(void) { unsigned int reg; reg = mips_read_c0_status(); reg &= ~(ST0_BEV); mips_write_c0_status(reg); reg = mips_read_c0_cause(); reg &= ~(CAUSE_IV); mips_write_c0_cause(reg); memcpy((void *)(EBASE + 0x180), &mips_first_exception_handler, 0x80); mips_setup_exc_table(); reg = mips_read_c0_status(); reg &= ~(ST0_ERL); mips_write_c0_status(reg); return 0; }
рдПрдХ рдмрд╛рдзрд╛, рдЕрдкрд╡рд╛рдж рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реЛрдиреЗ рдкрд░ рдЗрди рдмрд┐рдЯреНрд╕ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ 0x80000180 рдкрддреЗ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЗрд╕ рдкрддреЗ рдкрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛрдб рд╕реНрдерд┐рдд рд╣реИред рдЗрд╕реА рд╕рдордп, рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдореЛрдб рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, CP0_EPC рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдмрдЪрд╛рддрд╛ рд╣реИ, рдФрд░ CP0_CAUSE рд░рдЬрд┐рд╕реНрдЯрд░ (рдЕрдкрд╡рд╛рдж рдХреЛрдб рдлрд╝реАрд▓реНрдб рдореЗрдВ) рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг (рдкреНрд░рдХрд╛рд░) рд▓рд┐рдЦрддрд╛ рд╣реИред
рдЕрдкрд╡рд╛рдж рдХреЛрдб рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдордЖрдЗрдкреАрдПрд╕ рдореЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, рдПрдХ рдЙрдкрддрдВрддреНрд░ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рдж рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рд╣реИрдВрдбрд▓рд░ рдХреЛрдб рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдЬреЛ рдЕрдкрд╡рд╛рдж рдХреЛрдб рдлрд╝реАрд▓реНрдб рдореЗрдВ рджрд░реНрдЬ рдХреА рдЧрдИ рд╣реИред MIPS рдореЗрдВ, рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рди рд▓реЗ рд╕рдХрддрд╛ рд╣реИ:
рдХреЛрдб | рдкрдж | рд╡рд┐рд╡рд░рдг |
---|
0 | INT | рдмрд╛рд╣рд░реА рд╡реНрдпрд╡рдзрд╛рди |
1-3 | | рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ |
4 | ADDRL | Unaligned рдкрддреЗ рд╕реЗ рдкрдврд╝рдирд╛ |
5 | addrs | рдЕрд╕рдВрддреБрд▓рд┐рдд рдкрддрд╛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ |
6 | ibus | рдирд┐рд░реНрджреЗрд╢ рдкрдврд╝рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ |
7 | DBUS | рдбреЗрдЯрд╛ рдмрд╕ рдореЗрдВ рддреНрд░реБрдЯрд┐ |
8 | syscall | рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ |
9 | BKPT | рдмреНрд░реЗрдХрдкрд╛рдЗрдВрдЯ |
10 | рдЖрд░рдЖрдИ | рдЖрд░рдХреНрд╖рд┐рдд рдирд┐рд░реНрджреЗрд╢ |
11 | | рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ рддреНрд░реБрдЯрд┐ |
12 | OVF | рдЕрдВрдХрдЧрдгрд┐рдд рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ |
13 рдФрд░ рдКрдкрд░ | | рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдСрдкрд░реЗрд╢рди |
рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓
рдкрд╣рд▓реЗ рд╕реНрддрд░ рдХрд╛ рд╣реИрдВрдбрд▓рд░
рдкреНрд░рд╛рдердорд┐рдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
NESTED(mips_first_exception_handler, 0, $sp) .set push mfc0 $k1, $CP0_CAUSE andi $k1, $k1, 0x7c j mips_second_exception_handler nop .set pop END(mips_first_exception_handler)
рдпрд╣ рд╕рд┐рд░реНрдл рд░рдЬрд┐рд╕реНрдЯрд░ $ k1 рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдЖрдХрд╛рд░ рдореЗрдВ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдХреЙрд▓ рдХрдорд╛рдВрдб "j" рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ "рдЬрд╛рд░", рдХреНрдпреЛрдВрдХрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдордиреЗ рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрдВрдХреНрд╢рдиреНрд╕ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рд╣реИ), рдФрд░ рд╣рдореЗрдВ рдХреЙрд▓ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрддреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдБ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рдПрдХ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ k1 рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИред
MIPS рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ 32 рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд░рдЬрд┐рд╕реНрдЯрд░ r0 - r31 рд╣реИрдВред рдФрд░ рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛, рдХреБрдЫ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрд░ 31 рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рдирд╛рдо рд╕рдкрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣реА рд░рдЬрд┐рд╕реНрдЯрд░ k0 (r26) рдФрд░ k1 (r27) рдХреЗ рд╕рд╛рде рд╣реИ, рд╕рдВрдХрд▓рдХ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╡реЗ рдУрдПрд╕ рдХреЗ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рдФрд░ рд╡реНрдпрд╡рдзрд╛рди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗрд╡рд▓ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред
рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХрд╛ рд╣реИрдВрдбрд▓рд░
рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╕реА-рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрд╛рдХреА рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЕрд╕реЗрдореНрдмрд▓рд░ рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
LEAF(mips_second_exception_handler) SAVE_ALL PTR_L $k0, exception_handlers($k1) PTR_LA $ra, restore_from_exception move $a0, $sp jr $k0 nop restore_from_exception: RESTORE_ALL END(mips_second_exception_handler)
SAVE_ALL рдПрдХ рдХреЛрдбрд╛рдВрддрд░рдХ рдореИрдХреНрд░реЛ рд╣реИред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИред
.macro SAVE_ALL LONG_ADDI $sp, -PT_SIZE SAVE_SOME SAVE_AT SAVE_TEMP SAVE_STATIC .endm
рдореИрдВ рд╕рднреА рдиреЗрд╕реНрдЯреЗрдб рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рд░реБрдХрд╛рд╡рдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред
SAVE_AT - (r1) рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдирд┐рд░реНрджреЗрд╢
".рд╕реЗрдЯ рдиреЙрдЯ" рдФрд░
".рд╕реЗрдЯ рдПрдЯ" рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рддрд╛рдХрд┐ рдХреЛрдИ рдХрдВрдкрд╛рдЗрд▓рд░ рдЪреЗрддрд╛рд╡рдиреА рди рд╣реЛ)
SAVE_TEMP - рдЕрд╕реНрдерд╛рдпреА рд░рдЬрд┐рд╕реНрдЯрд░ (r8-r15) рдФрд░ (r24-r25) рдмрдЪрд╛рддрд╛ рд╣реИ
SAVE_STATIC - s0-s7 рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ
SAVE_SOME - рдЖрд╡рд╢реНрдпрдХ рд╕реЗрд╡рд╛ рд░рдЬрд┐рд╕реНрдЯрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдХреЛрдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдерд┐рддрд┐ рд░рдЬрд┐рд╕реНрдЯрд░), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореИрдХреНрд░реЛ рдкрд╣рд▓реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдлрд┐рд░ рджрд╛рд╣рд┐рдиреЗ рддреАрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рддреАрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдкрд╡рд╛рдж рдХрд╛ рдкреНрд░рдХрд╛рд░ рдСрдлрд╕реЗрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдСрдлрд╝рд╕реЗрдЯ рд╣реИ, рдЗрдВрдбреЗрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ MIPS рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ CAUSE рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдмрд╛рдИрдВ рдУрд░ рджреЛ рдмрд┐рдЯреНрд╕ рдХреА рдПрдХ рд╢рд┐рдлреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдкрд╡рд╛рдж рд╕рдВрдЦреНрдпрд╛ рдбрд╛рд▓ рджреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реАрдзреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдмрд┐рдирд╛ рд╡реНрдпреВрдЕрд░ рдХреЗ рдПрдХ рд╕рд░рдгреА рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ (рдЖрд░рдП) рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░реБрдХрд╛рд╡рдЯ рджрд░реНрдЬ рдХреА рдереА, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реНрдЯреИрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕реА-рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╣рдо рдЗрд╕ рдлреНрд░реЗрдо рдХреЗ рд╡рд┐рд╡рд░рдг (рд╕рдВрд░рдЪрдирд╛) рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рд╣реИ
typedef struct pt_regs { unsigned int reg[25]; unsigned int gp; unsigned int sp; unsigned int fp; unsigned int ra; unsigned int lo; unsigned int hi; unsigned int cp0_status; unsigned int pc; }pt_regs_t;
рддреГрддреАрдп-рд╕реНрддрд░реАрдп рд╣реИрдВрдбрд▓рд░ (C рдХреЛрдб)
рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ
void mips_c_syscall_handler(pt_regs_t *regs) { uint32_t result; uint32_t (*sys_func)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t) = SYSCALL_TABLE[regs->reg[1]]; result = sys_func(regs->reg[3], regs->reg[4], regs->reg[5], regs->reg[6], regs->reg[15]); regs->reg[1] = result; regs->pc += 4; }
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреЛрдб рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ:
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИрдВрдбрд▓рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
- рдлрд┐рд░ рд╣рдо рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
- рд░рдЬрд┐рд╕реНрдЯрд░ v0 рдореЗрдВ рд╣рдордиреЗ рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдбрд╛рд▓ рджрд┐рдпрд╛ред
- рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдорд╛рдВрдб рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЙрд╕реА рдкрддреЗ рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдпрд╣ рд╣реБрдЖ рдерд╛, рдФрд░ рдХреЙрд▓ рдлрд┐рд░ рд╕реЗ рд╣реЛрдЧрд╛ред
рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдЕрдм рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрд╕реЗрдореНрдмрд▓рд░ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, x86 рдореЗрдВ рдпрд╣
int рд╣реИ , SPARC рдореЗрдВ рдпрд╣
рдЯрд╛ рд╣реИ , рдФрд░ MIPS рдореЗрдВ рдпрд╣
syscall рд╣реИ ред
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡рддрдГ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рд╕рдордп, рдХреЙрд▓ рдирдВрдмрд░ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ v0 рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ a0, a1, a2, a3 рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ рдЬреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдП рдореЗрдВ рдПрдХ рддрд░реНрдХ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ 0x11 рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдЬреАрд╕реАрд╕реА рдЗрдирд▓рд╛рдЗрди рдХреЛрдбрд╛рдВрддрд░рдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ
static inline int syscall_demo(int arg1) { long __res; __asm__ volatile ( "move $a0, %2\n\t" "li $v0, %1\n\t" "syscall\n\t" "move %0, $v0" : "=r" (__res) : "I" (0x11), "r" ((long)(arg1))); return __res; }
рдмреЗрд╢рдХ, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдореИрдХреНрд░реЛ рдХреЛрдб рд╣реИ рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред
#define __SYSCALL1(NR,type,name,type1,arg1) \ static inline type name(type1 arg1) \ { \ long __res; \ __asm__ volatile ( \ "move $a0, %2\n\t" \ "li $v0, %1\n\t" \ "syscall\n\t" \ "move %0, $v0" \ \ : "=r" (__res) \ : "I" (NR), \ "r" ((long)(arg1))); \ return __res; \ }
рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рджрд┐рдП рдЧрдП рдХреЗ рд╕рдорд╛рди рд╣реИред
рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛ред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдиреАрдЪреЗ рд╕реНрдерд┐рдд рд╣реИред
SYSCALL1(1,int,syscall_1,int,arg1); TEST_CASE("calling syscall with one argument") { test_assert_equal(syscall_1(1), 1); }
SYSCALL рдореИрдХреНрд░реЛ
рдХреЛ рдЗрдирд▓рд╛рдЗрди
рдЕрд╕реЗрдореНрдмрд▓рд░ рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдирдВрдмрд░ 1 (рдореИрдХреНрд░реЛ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ) рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдирд╛рдо syscall_1 (рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░) рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдЗрдВрдЯ (рджреВрд╕рд░рд╛ рдореИрдХреНрд░реЛ рдкреИрд░рд╛рдореАрдЯрд░) рд╣реИ, рдФрд░ рдЪрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рднреА int (рдЪреМрдерд╛ рдореИрдХреНрд░реЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ) )ред
рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рдпрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ syscall_1 (1) рдкрд░ рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред
рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ
- рджрд╛рд╕ U- рдмреВрдЯ рд▓реЛрдбрд░ рдореЗрдВ MIPS рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рдзрд╛рди рд▓рд╛рдЧреВ рдХрд░рдирд╛
- рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ MIPS рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рдзрд╛рди рд▓рд╛рдЧреВ рдХрд░рдирд╛
- рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдХреЛрдб
рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдВрдд рдореЗрдВ, рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рд╡рд┐рд╖рдп рдХреА рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╕рдордЭ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рд▓реЗрдиреЗ рдФрд░ рдХреНрдпреВрдореВ рдЦреЗрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ (рд╡рд┐рдХреА рдкреЗрдЬ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ)ред рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдпрджрд┐ рдЖрдк рд╕рднреА рдЧреНрд░рд╣рдг рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЪрд▓рддреЗ рд╣реИрдВред
рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ, рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рд╕реБрдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред