ReactOS  0.4.15-dev-499-g1f31905
mmuutil.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int GetDEC (void)
 
int GetMSR (void)
 
int GetPhys (paddr_t addr)
 
int GetPhysHalf (paddr_t addr)
 
int GetPhysByte (paddr_t addr)
 
void SetPhys (paddr_t addr, int val)
 
void SetPhysHalf (paddr_t addr, int val)
 
void SetPhysByte (paddr_t addr, int val)
 
int GetSR (int n)
 
void SetSR (int n, int val)
 
void GetBat (int bat, int inst, int *batHi, int *batLo)
 
void SetBat (int bat, int inst, int batHi, int batLo)
 
int GetSDR1 (void)
 
void SetSDR1 (int newsdr)
 
int BatHit (int bath, int batl, int virt)
 
int BatTranslate (int bath, int batl, int virt)
 
int PpcVirt2phys (vaddr_t virt, int inst)
 
int PtegNumber (vaddr_t virt, int hfun)
 

Function Documentation

◆ BatHit()

int BatHit ( int  bath,
int  batl,
int  virt 
)
inline

Definition at line 308 of file mmu.c.

308  {
309  int mask = 0xfffe0000 & ~((batl & 0x3f) << 17);
310  return (batl & 0x40) && ((virt & mask) == (bath & mask));
311 }
GLenum GLint GLuint mask
Definition: glext.h:6028

Referenced by PpcVirt2phys().

◆ BatTranslate()

int BatTranslate ( int  bath,
int  batl,
int  virt 
)
inline

Definition at line 313 of file mmu.c.

313  {
314  return (virt & 0x007fffff) | (batl & 0xfffe0000);
315 }

Referenced by BatHit(), and PpcVirt2phys().

◆ GetBat()

void GetBat ( int  bat,
int  inst,
int batHi,
int batLo 
)
inline

Definition at line 191 of file mmu.c.

191  {
192  register int bh asm("r3"), bl asm("r4");
193  if( inst ) {
194  switch( bat ) {
195  case 0:
196  __asm__("mfibatu 3,0");
197  __asm__("mfibatl 4,0");
198  break;
199  case 1:
200  __asm__("mfibatu 3,1");
201  __asm__("mfibatl 4,1");
202  break;
203  case 2:
204  __asm__("mfibatu 3,2");
205  __asm__("mfibatl 4,2");
206  break;
207  case 3:
208  __asm__("mfibatu 3,3");
209  __asm__("mfibatl 4,3");
210  break;
211  }
212  } else {
213  switch( bat ) {
214  case 0:
215  __asm__("mfdbatu 3,0");
216  __asm__("mfdbatl 4,0");
217  break;
218  case 1:
219  __asm__("mfdbatu 3,1");
220  __asm__("mfdbatl 4,1");
221  break;
222  case 2:
223  __asm__("mfdbatu 3,2");
224  __asm__("mfdbatl 4,2");
225  break;
226  case 3:
227  __asm__("mfdbatu 3,3");
228  __asm__("mfdbatl 4,3");
229  break;
230  }
231  }
232  *batHi = bh;
233  *batLo = bl;
234 }
__asm__("\t.globl GetPhys\n" "GetPhys:\t\n" "mflr 0\n\t" "stwu 0,-16(1)\n\t" "mfmsr 5\n\t" "andi. 6,5,0xffef\n\t" "mtmsr 6\n\t" "isync\n\t" "sync\n\t" "lwz 3,0(3)\n\t" "mtmsr 5\n\t" "isync\n\t" "sync\n\t" "lwz 0,0(1)\n\t" "addi 1,1,16\n\t" "mtlr 0\n\t" "blr")

Referenced by PPCMMU(), and PpcVirt2phys().

◆ GetDEC()

int GetDEC ( void  )
inline

Definition at line 10 of file mmu.c.

10  {
11  register int res asm ("r3");
12  __asm__("mfdec 3");
13  return res;
14 }
__asm__("\t.globl GetPhys\n" "GetPhys:\t\n" "mflr 0\n\t" "stwu 0,-16(1)\n\t" "mfmsr 5\n\t" "andi. 6,5,0xffef\n\t" "mtmsr 6\n\t" "isync\n\t" "sync\n\t" "lwz 3,0(3)\n\t" "mtmsr 5\n\t" "isync\n\t" "sync\n\t" "lwz 0,0(1)\n\t" "addi 1,1,16\n\t" "mtlr 0\n\t" "blr")
GLuint res
Definition: glext.h:9613

◆ GetMSR()

int GetMSR ( void  )
inline

Definition at line 4 of file mmu.c.

4  {
5  register int res asm ("r3");
6  __asm__("mfmsr 3");
7  return res;
8 }
__asm__("\t.globl GetPhys\n" "GetPhys:\t\n" "mflr 0\n\t" "stwu 0,-16(1)\n\t" "mfmsr 5\n\t" "andi. 6,5,0xffef\n\t" "mtmsr 6\n\t" "isync\n\t" "sync\n\t" "lwz 3,0(3)\n\t" "mtmsr 5\n\t" "isync\n\t" "sync\n\t" "lwz 0,0(1)\n\t" "addi 1,1,16\n\t" "mtlr 0\n\t" "blr")
GLuint res
Definition: glext.h:9613

Referenced by PpcVirt2phys().

◆ GetPhys()

int GetPhys ( paddr_t  addr)

◆ GetPhysByte()

int GetPhysByte ( paddr_t  addr)

◆ GetPhysHalf()

int GetPhysHalf ( paddr_t  addr)

Referenced by ide_read(), and ide_setup().

◆ GetSDR1()

int GetSDR1 ( void  )
inline

Definition at line 282 of file mmu.c.

282  {
283  register int res asm("r3");
284  __asm__("mfsdr1 3");
285  return res;
286 }
__asm__("\t.globl GetPhys\n" "GetPhys:\t\n" "mflr 0\n\t" "stwu 0,-16(1)\n\t" "mfmsr 5\n\t" "andi. 6,5,0xffef\n\t" "mtmsr 6\n\t" "isync\n\t" "sync\n\t" "lwz 3,0(3)\n\t" "mtmsr 5\n\t" "isync\n\t" "sync\n\t" "lwz 0,0(1)\n\t" "addi 1,1,16\n\t" "mtlr 0\n\t" "blr")
GLuint res
Definition: glext.h:9613

Referenced by InsertPageEntry(), and PpcVirt2phys().

◆ GetSR()

int GetSR ( int  n)
inline

Definition at line 136 of file mmu.c.

136  {
137  register int res asm ("r3");
138  switch( n ) {
139  case 0:
140  __asm__("mfsr 3,0");
141  break;
142  case 1:
143  __asm__("mfsr 3,1");
144  break;
145  case 2:
146  __asm__("mfsr 3,2");
147  break;
148  case 3:
149  __asm__("mfsr 3,3");
150  break;
151  case 4:
152  __asm__("mfsr 3,4");
153  break;
154  case 5:
155  __asm__("mfsr 3,5");
156  break;
157  case 6:
158  __asm__("mfsr 3,6");
159  break;
160  case 7:
161  __asm__("mfsr 3,7");
162  break;
163  case 8:
164  __asm__("mfsr 3,8");
165  break;
166  case 9:
167  __asm__("mfsr 3,9");
168  break;
169  case 10:
170  __asm__("mfsr 3,10");
171  break;
172  case 11:
173  __asm__("mfsr 3,11");
174  break;
175  case 12:
176  __asm__("mfsr 3,12");
177  break;
178  case 13:
179  __asm__("mfsr 3,13");
180  break;
181  case 14:
182  __asm__("mfsr 3,14");
183  break;
184  case 15:
185  __asm__("mfsr 3,15");
186  break;
187  }
188  return res;
189 }
GLdouble n
Definition: glext.h:7729
__asm__("\t.globl GetPhys\n" "GetPhys:\t\n" "mflr 0\n\t" "stwu 0,-16(1)\n\t" "mfmsr 5\n\t" "andi. 6,5,0xffef\n\t" "mtmsr 6\n\t" "isync\n\t" "sync\n\t" "lwz 3,0(3)\n\t" "mtmsr 5\n\t" "isync\n\t" "sync\n\t" "lwz 0,0(1)\n\t" "addi 1,1,16\n\t" "mtlr 0\n\t" "blr")
GLuint res
Definition: glext.h:9613

Referenced by InsertPageEntry(), mmusetvsid(), PpcVirt2phys(), and PtegNumber().

◆ PpcVirt2phys()

int PpcVirt2phys ( vaddr_t  virt,
int  inst 
)

Definition at line 353 of file mmuutil.c.

353  {
354  int msr = GetMSR();
355  int txmask = inst ? 0x20 : 0x10;
356  int i, bath, batl, sr, sdr1, physbase, vahi, valo;
357  int npteg, hash, hashmask, ptehi, ptelo, ptegaddr;
358  int vsid, pteh, ptevsid, pteapi;
359 
360  if( msr & txmask ) {
361  sr = GetSR( virt >> 28 );
362  vsid = sr & 0xfffffff;
363  vahi = vsid >> 4;
364  valo = (vsid << 28) | (virt & 0xfffffff);
365  if( sr & 0x80000000 ) {
366  return valo;
367  }
368 
369  for( i = 0; i < 4; i++ ) {
370  GetBat( i, inst, &bath, &batl );
371  if( BatHit( bath, batl, virt ) ) {
372  return BatTranslate( bath, batl, virt );
373  }
374  }
375 
376  sdr1 = GetSDR1();
377 
378  physbase = sdr1 & ~0xffff;
379  hashmask = ((sdr1 & 0x1ff) << 10) | 0x3ff;
380  hash = (vsid & 0x7ffff) ^ ((valo >> 12) & 0xffff);
381  npteg = hashmask + 1;
382 
383  for( pteh = 0; pteh < 0x80; pteh += 64, hash ^= 0x7ffff ) {
384  ptegaddr = ((hashmask & hash) * 64) + physbase;
385 
386  for( i = 0; i < 8; i++ ) {
387  ptehi = GetPhys( ptegaddr + (i * 8) );
388  ptelo = GetPhys( ptegaddr + (i * 8) + 4 );
389 
390  ptevsid = (ptehi >> 7) & 0xffffff;
391  pteapi = ptehi & 0x3f;
392 
393  if( (ptehi & 64) != pteh ) continue;
394  if( ptevsid != (vsid & 0xffffff) ) continue;
395  if( pteapi != ((virt >> 22) & 0x3f) ) continue;
396 
397  return (ptelo & 0xfffff000) | (virt & 0xfff);
398  }
399  }
400  return -1;
401  } else {
402  return virt;
403  }
404 }
int GetMSR()
Definition: mmuutil.c:4
int GetSDR1()
Definition: mmuutil.c:312
int BatHit(int batu, int batl, int virt)
Definition: mmuutil.c:348
int GetSR(int n)
Definition: mmuutil.c:136
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
int hash
Definition: main.c:58
ULONG GetPhys(ULONG Addr)
void GetBat(int bat, int inst, int *batHi, int *batLo)
Definition: mmuutil.c:244
Definition: _hash_fun.h:40
int BatTranslate(int batu, int batl, int virt)
Definition: mmuutil.c:333

◆ PtegNumber()

int PtegNumber ( vaddr_t  virt,
int  hfun 
)

Definition at line 406 of file mmuutil.c.

407 {
408  int sr = GetSR( (virt >> 28) & 0xf );
409  int vsid = sr & PPC_VSID_MASK;
410  return ((((vsid & 0x7ffff) ^ ((virt >> 12) & 0xffff)) ^ (hfun ? -1 : 0)) & ((HTABSIZ - 1) >> 3) & 0x3ff);
411 }
#define PPC_VSID_MASK
Definition: mmu.h:67
int GetSR(int n)
Definition: mmuutil.c:136
#define HTABSIZ
Definition: mmu.h:59

Referenced by PtegFromPage(), and ptegreload().

◆ SetBat()

void SetBat ( int  bat,
int  inst,
int  batHi,
int  batLo 
)
inline

Definition at line 236 of file mmu.c.

236  {
237  register int bh asm("r3"), bl asm("r4");
238  bh = batHi;
239  bl = batLo;
240  if( inst ) {
241  switch( bat ) {
242  case 0:
243  __asm__("mtibatu 0,3");
244  __asm__("mtibatl 0,4");
245  break;
246  case 1:
247  __asm__("mtibatu 1,3");
248  __asm__("mtibatl 1,4");
249  break;
250  case 2:
251  __asm__("mtibatu 2,3");
252  __asm__("mtibatl 2,4");
253  break;
254  case 3:
255  __asm__("mtibatu 3,3");
256  __asm__("mtibatl 3,4");
257  break;
258  }
259  } else {
260  switch( bat ) {
261  case 0:
262  __asm__("mtdbatu 0,3");
263  __asm__("mtdbatl 0,4");
264  break;
265  case 1:
266  __asm__("mtdbatu 1,3");
267  __asm__("mtdbatl 1,4");
268  break;
269  case 2:
270  __asm__("mtdbatu 2,3");
271  __asm__("mtdbatl 2,4");
272  break;
273  case 3:
274  __asm__("mtdbatu 3,3");
275  __asm__("mtdbatl 3,4");
276  break;
277  }
278  }
279  __asm__("isync\n\tsync");
280 }
__asm__("\t.globl GetPhys\n" "GetPhys:\t\n" "mflr 0\n\t" "stwu 0,-16(1)\n\t" "mfmsr 5\n\t" "andi. 6,5,0xffef\n\t" "mtmsr 6\n\t" "isync\n\t" "sync\n\t" "lwz 3,0(3)\n\t" "mtmsr 5\n\t" "isync\n\t" "sync\n\t" "lwz 0,0(1)\n\t" "addi 1,1,16\n\t" "mtlr 0\n\t" "blr")

Referenced by _mmumain(), and PPCMMU().

◆ SetPhys()

void SetPhys ( paddr_t  addr,
int  val 
)

◆ SetPhysByte()

void SetPhysByte ( paddr_t  addr,
int  val 
)

◆ SetPhysHalf()

void SetPhysHalf ( paddr_t  addr,
int  val 
)

◆ SetSDR1()

void SetSDR1 ( int  newsdr)
inline

Definition at line 288 of file mmu.c.

288  {
289 #if 0
290  int i,j;
291 #endif
292  __asm__("mtsdr1 3");
293 #if 0
294  __asm__("sync");
295  __asm__("isync");
296  __asm__("ptesync");
297 
298  for( i = 0; i < 256; i++ ) {
299  j = i << 12;
300  __asm__("tlbie %0,0" : : "r" (j));
301  }
302  __asm__("eieio");
303  __asm__("tlbsync");
304  __asm__("ptesync");
305 #endif
306 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
__asm__("\t.globl GetPhys\n" "GetPhys:\t\n" "mflr 0\n\t" "stwu 0,-16(1)\n\t" "mfmsr 5\n\t" "andi. 6,5,0xffef\n\t" "mtmsr 6\n\t" "isync\n\t" "sync\n\t" "lwz 3,0(3)\n\t" "mtmsr 5\n\t" "isync\n\t" "sync\n\t" "lwz 0,0(1)\n\t" "addi 1,1,16\n\t" "mtlr 0\n\t" "blr")
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250

◆ SetSR()

void SetSR ( int  n,
int  val 
)
inline

Definition at line 191 of file mmuutil.c.

191  {
192  switch( n ) {
193  case 0:
194  __asm__("mtsr 0,%0" : : "r" (val));
195  break;
196  case 1:
197  __asm__("mtsr 1,%0" : : "r" (val));
198  break;
199  case 2:
200  __asm__("mtsr 2,%0" : : "r" (val));
201  break;
202  case 3:
203  __asm__("mtsr 3,%0" : : "r" (val));
204  break;
205  case 4:
206  __asm__("mtsr 4,%0" : : "r" (val));
207  break;
208  case 5:
209  __asm__("mtsr 5,%0" : : "r" (val));
210  break;
211  case 6:
212  __asm__("mtsr 6,%0" : : "r" (val));
213  break;
214  case 7:
215  __asm__("mtsr 7,%0" : : "r" (val));
216  break;
217  case 8:
218  __asm__("mtsr 8,%0" : : "r" (val));
219  break;
220  case 9:
221  __asm__("mtsr 9,%0" : : "r" (val));
222  break;
223  case 10:
224  __asm__("mtsr 10,%0" : : "r" (val));
225  break;
226  case 11:
227  __asm__("mtsr 11,%0" : : "r" (val));
228  break;
229  case 12:
230  __asm__("mtsr 12,%0" : : "r" (val));
231  break;
232  case 13:
233  __asm__("mtsr 13,%0" : : "r" (val));
234  break;
235  case 14:
236  __asm__("mtsr 14,%0" : : "r" (val));
237  break;
238  case 15:
239  __asm__("mtsr 15,%0" : : "r" (val));
240  break;
241  }
242 }
GLdouble n
Definition: glext.h:7729
GLuint GLfloat * val
Definition: glext.h:7180
__asm__("\t.globl GetPhys\n" "GetPhys:\t\n" "mflr 0\n\t" "stwu 0,-16(1)\n\t" "mfmsr 5\n\t" "andi. 6,5,0xffef\n\t" "mtmsr 6\n\t" "isync\n\t" "sync\n\t" "lwz 3,0(3)\n\t" "mtmsr 5\n\t" "isync\n\t" "sync\n\t" "lwz 0,0(1)\n\t" "addi 1,1,16\n\t" "mtlr 0\n\t" "blr")

Referenced by mmusetvsid().