source: rtems/cpukit/score/cpu/powerpc/ppc-context-validate.S @ d978d1b

5
Last change on this file since d978d1b was a6f84b27, checked in by Sebastian Huber <sebastian.huber@…>, on 08/01/17 at 08:57:46

powerpc: Add 64-bit context/interrupt support

Update #3082.

  • Property mode set to 100644
File size: 12.1 KB
Line 
1/*
2 * Copyright (c) 2013, 2017 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16  #include "config.h"
17#endif
18
19#include <rtems/asm.h>
20#include <rtems/score/cpu.h>
21
22#define LR_OFFSET 8
23#define CR_OFFSET 16
24#define OFFSET(i) ((i) * PPC_GPR_SIZE + 32)
25#define GPR14_OFFSET OFFSET(0)
26#define GPR15_OFFSET OFFSET(1)
27#define GPR16_OFFSET OFFSET(2)
28#define GPR17_OFFSET OFFSET(3)
29#define GPR18_OFFSET OFFSET(4)
30#define GPR19_OFFSET OFFSET(5)
31#define GPR20_OFFSET OFFSET(6)
32#define GPR21_OFFSET OFFSET(7)
33#define GPR22_OFFSET OFFSET(8)
34#define GPR23_OFFSET OFFSET(9)
35#define GPR24_OFFSET OFFSET(10)
36#define GPR25_OFFSET OFFSET(11)
37#define GPR26_OFFSET OFFSET(12)
38#define GPR27_OFFSET OFFSET(13)
39#define GPR28_OFFSET OFFSET(14)
40#define GPR29_OFFSET OFFSET(15)
41#define GPR30_OFFSET OFFSET(16)
42#define GPR31_OFFSET OFFSET(17)
43
44#ifdef PPC_MULTILIB_FPU
45  #define FOFFSET(i) ((i) * 8 + OFFSET(18))
46  #define F14_OFFSET FOFFSET(0)
47  #define F15_OFFSET FOFFSET(1)
48  #define F16_OFFSET FOFFSET(2)
49  #define F17_OFFSET FOFFSET(3)
50  #define F18_OFFSET FOFFSET(4)
51  #define F19_OFFSET FOFFSET(5)
52  #define F20_OFFSET FOFFSET(6)
53  #define F21_OFFSET FOFFSET(7)
54  #define F22_OFFSET FOFFSET(8)
55  #define F23_OFFSET FOFFSET(9)
56  #define F24_OFFSET FOFFSET(10)
57  #define F25_OFFSET FOFFSET(11)
58  #define F26_OFFSET FOFFSET(12)
59  #define F27_OFFSET FOFFSET(13)
60  #define F28_OFFSET FOFFSET(14)
61  #define F29_OFFSET FOFFSET(15)
62  #define F30_OFFSET FOFFSET(16)
63  #define F31_OFFSET FOFFSET(17)
64  #define FPSCR_OFFSET FOFFSET(18)
65  #define FTMP_OFFSET FOFFSET(19)
66  #define FTMP2_OFFSET FOFFSET(20)
67  #define FPUEND FOFFSET(21)
68#else
69  #define FPUEND OFFSET(18)
70#endif
71
72#ifdef PPC_MULTILIB_ALTIVEC
73  #define VOFFSET(i) ((i) * 16 + ((FPUEND + 16 - 1) & ~(16 - 1)))
74  #define V20_OFFSET VOFFSET(0)
75  #define V21_OFFSET VOFFSET(1)
76  #define V22_OFFSET VOFFSET(2)
77  #define V23_OFFSET VOFFSET(3)
78  #define V24_OFFSET VOFFSET(4)
79  #define V25_OFFSET VOFFSET(5)
80  #define V26_OFFSET VOFFSET(6)
81  #define V27_OFFSET VOFFSET(7)
82  #define V28_OFFSET VOFFSET(8)
83  #define V29_OFFSET VOFFSET(9)
84  #define V30_OFFSET VOFFSET(10)
85  #define V31_OFFSET VOFFSET(11)
86  #define VTMP_OFFSET VOFFSET(12)
87  #define VTMP2_OFFSET VOFFSET(13)
88  #define VRSAVE_OFFSET VOFFSET(14)
89  #define VSCR_OFFSET (VOFFSET(14) + 12)
90  #define ALTIVECEND VOFFSET(15)
91#else
92  #define ALTIVECEND FPUEND
93#endif
94
95#define FRAME_SIZE \
96  ((ALTIVECEND + CPU_STACK_ALIGNMENT - 1) & ~(CPU_STACK_ALIGNMENT - 1))
97
98        .global _CPU_Context_validate
99
100_CPU_Context_validate:
101
102        /* Save */
103        PPC_REG_STORE_UPDATE    r1, -FRAME_SIZE(r1)
104        mflr    r4
105        PPC_REG_STORE   r4, LR_OFFSET(r1)
106        mfcr    r4
107        stw     r4, CR_OFFSET(r1)
108        PPC_REG_STORE   r14, GPR14_OFFSET(r1)
109        PPC_REG_STORE   r15, GPR15_OFFSET(r1)
110        PPC_REG_STORE   r16, GPR16_OFFSET(r1)
111        PPC_REG_STORE   r17, GPR17_OFFSET(r1)
112        PPC_REG_STORE   r18, GPR18_OFFSET(r1)
113        PPC_REG_STORE   r19, GPR19_OFFSET(r1)
114        PPC_REG_STORE   r20, GPR20_OFFSET(r1)
115        PPC_REG_STORE   r21, GPR21_OFFSET(r1)
116        PPC_REG_STORE   r22, GPR22_OFFSET(r1)
117        PPC_REG_STORE   r23, GPR23_OFFSET(r1)
118        PPC_REG_STORE   r24, GPR24_OFFSET(r1)
119        PPC_REG_STORE   r25, GPR25_OFFSET(r1)
120        PPC_REG_STORE   r26, GPR26_OFFSET(r1)
121        PPC_REG_STORE   r27, GPR27_OFFSET(r1)
122        PPC_REG_STORE   r28, GPR28_OFFSET(r1)
123        PPC_REG_STORE   r29, GPR29_OFFSET(r1)
124        PPC_REG_STORE   r30, GPR30_OFFSET(r1)
125        PPC_REG_STORE   r31, GPR31_OFFSET(r1)
126
127#ifdef PPC_MULTILIB_FPU
128        stfd    f14, F14_OFFSET(r1)
129        stfd    f15, F15_OFFSET(r1)
130        stfd    f16, F16_OFFSET(r1)
131        stfd    f17, F17_OFFSET(r1)
132        stfd    f18, F18_OFFSET(r1)
133        stfd    f19, F19_OFFSET(r1)
134        stfd    f20, F20_OFFSET(r1)
135        stfd    f21, F21_OFFSET(r1)
136        stfd    f22, F22_OFFSET(r1)
137        stfd    f23, F23_OFFSET(r1)
138        stfd    f24, F24_OFFSET(r1)
139        stfd    f25, F25_OFFSET(r1)
140        stfd    f26, F26_OFFSET(r1)
141        stfd    f27, F27_OFFSET(r1)
142        stfd    f28, F28_OFFSET(r1)
143        stfd    f29, F29_OFFSET(r1)
144        stfd    f30, F30_OFFSET(r1)
145        stfd    f31, F31_OFFSET(r1)
146        mffs    f0
147        stfd    f0, FPSCR_OFFSET(r1)
148#endif
149
150#ifdef PPC_MULTILIB_ALTIVEC
151        li      r0, V20_OFFSET
152        stvx    v20, r1, r0
153        li      r0, V21_OFFSET
154        stvx    v21, r1, r0
155        li      r0, V22_OFFSET
156        stvx    v22, r1, r0
157        li      r0, V23_OFFSET
158        stvx    v23, r1, r0
159        li      r0, V24_OFFSET
160        stvx    v24, r1, r0
161        li      r0, V25_OFFSET
162        stvx    v25, r1, r0
163        li      r0, V26_OFFSET
164        stvx    v26, r1, r0
165        li      r0, V27_OFFSET
166        stvx    v27, r1, r0
167        li      r0, V28_OFFSET
168        stvx    v28, r1, r0
169        li      r0, V29_OFFSET
170        stvx    v29, r1, r0
171        li      r0, V30_OFFSET
172        stvx    v30, r1, r0
173        li      r0, V31_OFFSET
174        stvx    v31, r1, r0
175        mfvscr  v0
176        li      r0, VSCR_OFFSET
177        stvewx  v0, r1, r0
178        mfvrsave        r0
179        stw     r0, VRSAVE_OFFSET(r1)
180#endif
181
182        /* Fill */
183
184        /* CR and GPR29 are equal most of the time */
185        addi    r4, r3, 24
186        mtcr    r4
187
188        addi    r4, r3, 25
189        mtlr    r4
190        addi    r4, r3, 26
191        mtctr   r4
192        rlwinm  r4, r3, 0, 25, 2
193        mtxer   r4
194        addi    r0, r3, 28
195
196        /* GPR4 is used for temporary values */
197
198        addi    r5, r3, 1
199        addi    r6, r3, 2
200        addi    r7, r3, 3
201        addi    r8, r3, 4
202        addi    r9, r3, 5
203        addi    r10, r3, 6
204        addi    r11, r3, 7
205        addi    r12, r3, 8
206        addi    r14, r3, 9
207        addi    r15, r3, 10
208        addi    r16, r3, 11
209        addi    r17, r3, 12
210        addi    r18, r3, 13
211        addi    r19, r3, 14
212        addi    r20, r3, 15
213        addi    r21, r3, 16
214        addi    r22, r3, 17
215        addi    r23, r3, 18
216        addi    r24, r3, 19
217        addi    r25, r3, 20
218        addi    r26, r3, 21
219        addi    r27, r3, 22
220
221        /* GPR28 contains the TP pattern */
222#ifdef __powerpc64__
223        xor     r28, r13, r3
224#else
225        xor     r28, r2, r3
226#endif
227
228        /* GPR29 and CR are equal most of the time */
229        addi    r29, r3, 24
230
231        /* GPR30 contains the MSR pattern */
232        mfmsr   r30
233        xor     r30, r30, r3
234
235        /* GPR31 contains the stack pointer */
236        mr      r31, r1
237
238#ifdef PPC_MULTILIB_FPU
239.macro FILL_F i
240        addi    r4, r3, 0x100 + \i
241        stw     r4, FTMP_OFFSET(r1)
242        addi    r4, r3, 0x200 + \i
243        stw     r4, FTMP_OFFSET + 4(r1)
244        lfd     \i, FTMP_OFFSET(r1)
245.endm
246
247        FILL_F 0
248        FILL_F 1
249        FILL_F 2
250        FILL_F 3
251        FILL_F 4
252        FILL_F 5
253        FILL_F 6
254        FILL_F 7
255        FILL_F 8
256        FILL_F 9
257        FILL_F 10
258        FILL_F 11
259        FILL_F 12
260        FILL_F 13
261        FILL_F 14
262        FILL_F 15
263        FILL_F 16
264        FILL_F 17
265        FILL_F 18
266        FILL_F 19
267        FILL_F 20
268        FILL_F 21
269        FILL_F 22
270        FILL_F 23
271        FILL_F 24
272        FILL_F 25
273        FILL_F 26
274        FILL_F 27
275        FILL_F 28
276        FILL_F 29
277        FILL_F 30
278        FILL_F 31
279#endif
280
281#ifdef PPC_MULTILIB_ALTIVEC
282.macro FILL_V i
283        addi    r4, r3, 0x300 + \i
284        stw     r4, VTMP_OFFSET(r1)
285        addi    r4, r3, 0x400 + \i
286        stw     r4, VTMP_OFFSET + 4(r1)
287        addi    r4, r3, 0x500 + \i
288        stw     r4, VTMP_OFFSET + 8(r1)
289        addi    r4, r3, 0x600 + \i
290        stw     r4, VTMP_OFFSET + 12(r1)
291        li      r4, VTMP_OFFSET
292        lvx     \i, r1, r4
293.endm
294
295        FILL_V 0
296        FILL_V 1
297        FILL_V 2
298        FILL_V 3
299        FILL_V 4
300        FILL_V 5
301        FILL_V 6
302        FILL_V 7
303        FILL_V 8
304        FILL_V 9
305        FILL_V 10
306        FILL_V 11
307        FILL_V 12
308        FILL_V 13
309        FILL_V 14
310        FILL_V 15
311        FILL_V 16
312        FILL_V 17
313        FILL_V 18
314        FILL_V 19
315        FILL_V 20
316        FILL_V 21
317        FILL_V 22
318        FILL_V 23
319        FILL_V 24
320        FILL_V 25
321        FILL_V 26
322        FILL_V 27
323        FILL_V 28
324        FILL_V 29
325        FILL_V 30
326        FILL_V 31
327        addi    r4, r3, 0x700
328        mtvrsave        r4
329#endif
330
331        /* Check */
332check:
333        mfcr    r4
334        cmpw    r4, r29
335        bne     restore
336        addi    r4, r3, 1
337        PPC_REG_CMP     r4, r5
338        bne     restore
339        addi    r4, r3, 2
340        PPC_REG_CMP     r4, r6
341        bne     restore
342        addi    r4, r3, 3
343        PPC_REG_CMP     r4, r7
344        bne     restore
345        addi    r4, r3, 4
346        PPC_REG_CMP     r4, r8
347        bne     restore
348        addi    r4, r3, 5
349        PPC_REG_CMP     r4, r9
350        bne     restore
351        addi    r4, r3, 6
352        PPC_REG_CMP     r4, r10
353        bne     restore
354        addi    r4, r3, 7
355        PPC_REG_CMP     r4, r11
356        bne     restore
357        addi    r4, r3, 8
358        PPC_REG_CMP     r4, r12
359        bne     restore
360#ifdef __powerpc64__
361        lis     r4, .TOC.@highest
362        ori     r4, r4, .TOC.@higher
363        rldicr  r4, r4, 32, 31
364        oris    r4, r4, .TOC.@h
365        ori     r4, r4, .TOC.@l
366        PPC_REG_CMP     r4, r2
367#else
368        lis     r4, _SDA_BASE_@h
369        ori     r4, r4, _SDA_BASE_@l
370        PPC_REG_CMP     r4, r13
371#endif
372        bne     restore
373        addi    r4, r3, 9
374        PPC_REG_CMP     r4, r14
375        bne     restore
376        addi    r4, r3, 10
377        PPC_REG_CMP     r4, r15
378        bne     restore
379        addi    r4, r3, 11
380        PPC_REG_CMP     r4, r16
381        bne     restore
382        addi    r4, r3, 12
383        PPC_REG_CMP     r4, r17
384        bne     restore
385        addi    r4, r3, 13
386        PPC_REG_CMP     r4, r18
387        bne     restore
388        addi    r4, r3, 14
389        PPC_REG_CMP     r4, r19
390        bne     restore
391        addi    r4, r3, 15
392        PPC_REG_CMP     r4, r20
393        bne     restore
394        addi    r4, r3, 16
395        PPC_REG_CMP     r4, r21
396        bne     restore
397        addi    r4, r3, 17
398        PPC_REG_CMP     r4, r22
399        bne     restore
400        addi    r4, r3, 18
401        PPC_REG_CMP     r4, r23
402        bne     restore
403        addi    r4, r3, 19
404        PPC_REG_CMP     r4, r24
405        bne     restore
406        addi    r4, r3, 20
407        PPC_REG_CMP     r4, r25
408        bne     restore
409        addi    r4, r3, 21
410        PPC_REG_CMP     r4, r26
411        bne     restore
412        addi    r4, r3, 22
413        PPC_REG_CMP     r4, r27
414        bne     restore
415#ifdef __powerpc64__
416        xor     r4, r13, r3
417#else
418        xor     r4, r2, r3
419#endif
420        PPC_REG_CMP     r4, r28
421        bne     restore
422        addi    r4, r3, 24
423        PPC_REG_CMP     r4, r29
424        bne     restore
425        mfmsr   r4
426        xor     r4, r4, r3
427        PPC_REG_CMP     r4, r30
428        bne     restore
429        addi    r4, r3, 25
430        mflr    r5
431        PPC_REG_CMP     r4, r5
432        bne     restore
433        addi    r4, r3, 26
434        mfctr   r5
435        PPC_REG_CMP     r4, r5
436        bne     restore
437        rlwinm  r4, r3, 0, 25, 2
438        mfxer   r5
439        cmpw    r4, r5
440        bne     restore
441        addi    r4, r3, 28
442        PPC_REG_CMP     r4, r0
443        bne     restore
444        PPC_REG_CMP     r31, r1
445        bne     restore
446
447#ifdef PPC_MULTILIB_FPU
448.macro CHECK_F i
449        stfd    \i, FTMP_OFFSET(r1)
450        lwz     r5, FTMP_OFFSET(r1)
451        addi    r4, r3, 0x100 + \i
452        cmpw    r5, r4
453        bne     restore
454        lwz     r5, FTMP_OFFSET + 4(r1)
455        addi    r4, r3, 0x200 + \i
456        cmpw    r5, r4
457        bne     restore
458.endm
459
460        /* Check FPSCR */
461        stfd    f0, FTMP_OFFSET(r1)
462        mffs    f0
463        stfd    f0, FTMP2_OFFSET(r1)
464        lwz     r4, FTMP2_OFFSET + 4(r1)
465        lwz     r5, FPSCR_OFFSET + 4(r1)
466        cmpw    r5, r4
467        bne     restore
468        lfd     f0, FTMP_OFFSET(r1)
469
470        CHECK_F 0
471        CHECK_F 1
472        CHECK_F 2
473        CHECK_F 3
474        CHECK_F 4
475        CHECK_F 5
476        CHECK_F 6
477        CHECK_F 7
478        CHECK_F 8
479        CHECK_F 9
480        CHECK_F 10
481        CHECK_F 11
482        CHECK_F 12
483        CHECK_F 13
484        CHECK_F 14
485        CHECK_F 15
486        CHECK_F 16
487        CHECK_F 17
488        CHECK_F 18
489        CHECK_F 19
490        CHECK_F 20
491        CHECK_F 21
492        CHECK_F 22
493        CHECK_F 23
494        CHECK_F 24
495        CHECK_F 25
496        CHECK_F 26
497        CHECK_F 27
498        CHECK_F 28
499        CHECK_F 29
500        CHECK_F 30
501        CHECK_F 31
502#endif
503
504#ifdef PPC_MULTILIB_ALTIVEC
505.macro CHECK_V i
506        li      r4, VTMP_OFFSET
507        stvx    \i, r1, r4
508        lwz     r5, VTMP_OFFSET(r1)
509        addi    r4, r3, 0x300 + \i
510        cmpw    r5, r4
511        bne     restore
512        lwz     r5, VTMP_OFFSET + 4(r1)
513        addi    r4, r3, 0x400 + \i
514        cmpw    r5, r4
515        bne     restore
516        lwz     r5, VTMP_OFFSET + 8(r1)
517        addi    r4, r3, 0x500 + \i
518        cmpw    r5, r4
519        bne     restore
520        lwz     r5, VTMP_OFFSET + 12(r1)
521        addi    r4, r3, 0x600 + \i
522        cmpw    r5, r4
523        bne     restore
524.endm
525
526        /* Check VSCR */
527        li      r4, VTMP_OFFSET
528        stvx    v0, r1, r4
529        mfvscr  v0
530        li      r4, VTMP2_OFFSET + 12
531        stvewx  v0, r1, r4
532        lwz     r4, VTMP2_OFFSET + 12(r1)
533        lwz     r5, VSCR_OFFSET(r1)
534        cmpw    r5, r4
535        bne     restore
536        li      r4, VTMP_OFFSET
537        lvx     v0, r1, r4
538
539        CHECK_V 0
540        CHECK_V 1
541        CHECK_V 2
542        CHECK_V 3
543        CHECK_V 4
544        CHECK_V 5
545        CHECK_V 6
546        CHECK_V 7
547        CHECK_V 8
548        CHECK_V 9
549        CHECK_V 10
550        CHECK_V 11
551        CHECK_V 12
552        CHECK_V 13
553        CHECK_V 14
554        CHECK_V 15
555        CHECK_V 16
556        CHECK_V 17
557        CHECK_V 18
558        CHECK_V 19
559        CHECK_V 20
560        CHECK_V 21
561        CHECK_V 22
562        CHECK_V 23
563        CHECK_V 24
564        CHECK_V 25
565        CHECK_V 26
566        CHECK_V 27
567        CHECK_V 28
568        CHECK_V 29
569        CHECK_V 30
570        CHECK_V 31
571        mfvrsave        r5
572        addi    r4, r3, 0x700
573        cmpw    r5, r4
574        bne     restore
575#endif
576
577        mtcr    r29
578        addi    r5, r3, 1
579        b       check
580
581        /* Restore */
582restore:
583
584#ifdef PPC_MULTILIB_ALTIVEC
585        lwz     r0, VRSAVE_OFFSET(r1)
586        mtvrsave        r0
587        li      r0, V31_OFFSET
588        lvx     v31, r1, r0
589        li      r0, V30_OFFSET
590        lvx     v30, r1, r0
591        li      r0, V29_OFFSET
592        lvx     v29, r1, r0
593        li      r0, V28_OFFSET
594        lvx     v28, r1, r0
595        li      r0, V27_OFFSET
596        lvx     v27, r1, r0
597        li      r0, V26_OFFSET
598        lvx     v26, r1, r0
599        li      r0, V25_OFFSET
600        lvx     v25, r1, r0
601        li      r0, V24_OFFSET
602        lvx     v24, r1, r0
603        li      r0, V23_OFFSET
604        lvx     v23, r1, r0
605        li      r0, V22_OFFSET
606        lvx     v22, r1, r0
607        li      r0, V21_OFFSET
608        lvx     v21, r1, r0
609        li      r0, V20_OFFSET
610        lvx     v20, r1, r0
611#endif
612
613#ifdef PPC_MULTILIB_FPU
614        lfd     f31, F31_OFFSET(r1)
615        lfd     f30, F30_OFFSET(r1)
616        lfd     f29, F29_OFFSET(r1)
617        lfd     f28, F28_OFFSET(r1)
618        lfd     f27, F27_OFFSET(r1)
619        lfd     f26, F26_OFFSET(r1)
620        lfd     f25, F25_OFFSET(r1)
621        lfd     f24, F24_OFFSET(r1)
622        lfd     f23, F23_OFFSET(r1)
623        lfd     f22, F22_OFFSET(r1)
624        lfd     f21, F21_OFFSET(r1)
625        lfd     f20, F20_OFFSET(r1)
626        lfd     f19, F19_OFFSET(r1)
627        lfd     f18, F18_OFFSET(r1)
628        lfd     f17, F17_OFFSET(r1)
629        lfd     f16, F16_OFFSET(r1)
630        lfd     f15, F15_OFFSET(r1)
631        lfd     f14, F14_OFFSET(r1)
632#endif
633
634        PPC_REG_LOAD    r31, GPR31_OFFSET(r1)
635        PPC_REG_LOAD    r30, GPR30_OFFSET(r1)
636        PPC_REG_LOAD    r29, GPR29_OFFSET(r1)
637        PPC_REG_LOAD    r28, GPR28_OFFSET(r1)
638        PPC_REG_LOAD    r27, GPR27_OFFSET(r1)
639        PPC_REG_LOAD    r26, GPR26_OFFSET(r1)
640        PPC_REG_LOAD    r25, GPR25_OFFSET(r1)
641        PPC_REG_LOAD    r24, GPR24_OFFSET(r1)
642        PPC_REG_LOAD    r23, GPR23_OFFSET(r1)
643        PPC_REG_LOAD    r22, GPR22_OFFSET(r1)
644        PPC_REG_LOAD    r21, GPR21_OFFSET(r1)
645        PPC_REG_LOAD    r20, GPR20_OFFSET(r1)
646        PPC_REG_LOAD    r19, GPR19_OFFSET(r1)
647        PPC_REG_LOAD    r18, GPR18_OFFSET(r1)
648        PPC_REG_LOAD    r17, GPR17_OFFSET(r1)
649        PPC_REG_LOAD    r16, GPR16_OFFSET(r1)
650        PPC_REG_LOAD    r15, GPR15_OFFSET(r1)
651        PPC_REG_LOAD    r14, GPR14_OFFSET(r1)
652        lwz     r4, CR_OFFSET(r1)
653        mtcr    r4
654        PPC_REG_LOAD    r4, LR_OFFSET(r1)
655        mtlr    r4
656        addi    r1, r1, FRAME_SIZE
657        blr
Note: See TracBrowser for help on using the repository browser.