Changeset 40f81ce6 in rtems


Ignore:
Timestamp:
Jun 27, 2018, 10:18:09 AM (10 months ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
dffc08c
Parents:
71af1a4
git-author:
Sebastian Huber <sebastian.huber@…> (06/27/18 10:18:09)
git-committer:
Sebastian Huber <sebastian.huber@…> (06/29/18 08:04:37)
Message:

riscv: Implement _CPU_Context_validate()

Update #3433.

Location:
cpukit/score/cpu/riscv
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cpukit/score/cpu/riscv/include/rtems/score/cpu.h

    r71af1a4 r40f81ce6  
    416416void _CPU_Context_volatile_clobber( uintptr_t pattern );
    417417
    418 static inline void _CPU_Context_validate( uintptr_t pattern )
    419 {
    420   while (1) {
    421     /* TODO */
    422   }
    423 }
     418void _CPU_Context_validate( uintptr_t pattern );
    424419
    425420typedef uint32_t CPU_Counter_ticks;
  • cpukit/score/cpu/riscv/riscv-context-validate.S

    r71af1a4 r40f81ce6  
    11/*
    2  * Copyrigh (c) 2015 Hesham Almatary <hesham@alumni.york.ac.uk>
     2 * Copyright (c) 2018 embedded brains GmbH
     3 * Copyright (c) 2015 Hesham Almatary <hesham@alumni.york.ac.uk>
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    3132#include <rtems/score/cpu.h>
    3233
     34#define OFFSET(i) ((i) * CPU_SIZEOF_POINTER)
     35
     36#define RA_OFFSET OFFSET(0)
     37#define T0_OFFSET OFFSET(1)
     38#define T1_OFFSET OFFSET(2)
     39#define T2_OFFSET OFFSET(3)
     40#define S0_OFFSET OFFSET(4)
     41#define S1_OFFSET OFFSET(5)
     42#define A0_OFFSET OFFSET(6)
     43#define A1_OFFSET OFFSET(7)
     44#define A2_OFFSET OFFSET(8)
     45#define A3_OFFSET OFFSET(9)
     46#define A4_OFFSET OFFSET(10)
     47#define A5_OFFSET OFFSET(11)
     48#define A6_OFFSET OFFSET(12)
     49#define A7_OFFSET OFFSET(13)
     50#define S2_OFFSET OFFSET(14)
     51#define S3_OFFSET OFFSET(15)
     52#define S4_OFFSET OFFSET(16)
     53#define S5_OFFSET OFFSET(17)
     54#define S6_OFFSET OFFSET(18)
     55#define S7_OFFSET OFFSET(19)
     56#define S8_OFFSET OFFSET(20)
     57#define S9_OFFSET OFFSET(21)
     58#define S10_OFFSET OFFSET(22)
     59#define S11_OFFSET OFFSET(23)
     60#define T3_OFFSET OFFSET(24)
     61#define T4_OFFSET OFFSET(25)
     62#define T5_OFFSET OFFSET(26)
     63#define T6_OFFSET OFFSET(27)
     64
     65#define FRAME_SIZE \
     66  ((OFFSET(28) + CPU_STACK_ALIGNMENT - 1) & ~(CPU_STACK_ALIGNMENT - 1))
     67
    3368        .section        .text, "ax", @progbits
    3469        .align  2
     
    3671PUBLIC(_CPU_Context_validate)
    3772SYM(_CPU_Context_validate):
    38         /* RISC-V/RTEMS context has 36 registers of CPU_SIZEOF_POINTER size */
    39         addi    sp, sp, -1 * 36 * CPU_SIZEOF_POINTER
    40 
    41         SREG    x1, (1 * CPU_SIZEOF_POINTER)(sp)
    42         /* Skip x2/sp */
    43         SREG    x3, (3 * CPU_SIZEOF_POINTER)(sp)
    44         SREG    x4, (4 * CPU_SIZEOF_POINTER)(sp)
    45         SREG    x5, (5 * CPU_SIZEOF_POINTER)(sp)
    46         SREG    x6, (6 * CPU_SIZEOF_POINTER)(sp)
    47         SREG    x7, (7 * CPU_SIZEOF_POINTER)(sp)
    48         SREG    x8, (8 * CPU_SIZEOF_POINTER)(sp)
    49         SREG    x9, (9 * CPU_SIZEOF_POINTER)(sp)
    50         SREG    x10, (10 * CPU_SIZEOF_POINTER)(sp)
    51         SREG    x11, (11 * CPU_SIZEOF_POINTER)(sp)
    52         SREG    x12, (12 * CPU_SIZEOF_POINTER)(sp)
    53         SREG    x13, (13 * CPU_SIZEOF_POINTER)(sp)
    54         SREG    x14, (14 * CPU_SIZEOF_POINTER)(sp)
    55         SREG    x15, (15 * CPU_SIZEOF_POINTER)(sp)
    56         SREG    x16, (16 * CPU_SIZEOF_POINTER)(sp)
    57         SREG    x17, (17 * CPU_SIZEOF_POINTER)(sp)
    58         SREG    x18, (18 * CPU_SIZEOF_POINTER)(sp)
    59         SREG    x19, (19 * CPU_SIZEOF_POINTER)(sp)
    60         SREG    x20, (20 * CPU_SIZEOF_POINTER)(sp)
    61         SREG    x21, (21 * CPU_SIZEOF_POINTER)(sp)
    62         SREG    x22, (22 * CPU_SIZEOF_POINTER)(sp)
    63         SREG    x23, (23 * CPU_SIZEOF_POINTER)(sp)
    64         SREG    x24, (24 * CPU_SIZEOF_POINTER)(sp)
    65         SREG    x25, (25 * CPU_SIZEOF_POINTER)(sp)
    66         SREG    x26, (26 * CPU_SIZEOF_POINTER)(sp)
    67         SREG    x27, (27 * CPU_SIZEOF_POINTER)(sp)
    68         SREG    x28, (28 * CPU_SIZEOF_POINTER)(sp)
    69         SREG    x29, (28 * CPU_SIZEOF_POINTER)(sp)
    70         SREG    x30, (30 * CPU_SIZEOF_POINTER)(sp)
    71         SREG    x31, (31 * CPU_SIZEOF_POINTER)(sp)
     73        addi    sp, sp, -FRAME_SIZE
     74
     75        /* Save */
     76        SREG    ra, RA_OFFSET(sp)
     77        SREG    t0, T0_OFFSET(sp)
     78        SREG    t1, T1_OFFSET(sp)
     79        SREG    t2, T2_OFFSET(sp)
     80        SREG    s0, S0_OFFSET(sp)
     81        SREG    s1, S1_OFFSET(sp)
     82        SREG    a0, A0_OFFSET(sp)
     83        SREG    a1, A1_OFFSET(sp)
     84        SREG    a2, A2_OFFSET(sp)
     85        SREG    a3, A3_OFFSET(sp)
     86        SREG    a4, A4_OFFSET(sp)
     87        SREG    a5, A5_OFFSET(sp)
     88        SREG    a6, A6_OFFSET(sp)
     89        SREG    a7, A7_OFFSET(sp)
     90        SREG    s2, S2_OFFSET(sp)
     91        SREG    s3, S3_OFFSET(sp)
     92        SREG    s4, S4_OFFSET(sp)
     93        SREG    s5, S5_OFFSET(sp)
     94        SREG    s6, S6_OFFSET(sp)
     95        SREG    s7, S7_OFFSET(sp)
     96        SREG    s8, S8_OFFSET(sp)
     97        SREG    s9, S9_OFFSET(sp)
     98        SREG    s10, S10_OFFSET(sp)
     99        SREG    s11, S11_OFFSET(sp)
     100        SREG    t3, T3_OFFSET(sp)
     101        SREG    t4, T4_OFFSET(sp)
     102        SREG    t5, T5_OFFSET(sp)
     103        SREG    t6, T6_OFFSET(sp)
    72104
    73105        /* Fill */
    74 
     106        addi    ra, a0, 1
     107        /* sp must remain as is */
     108        /* gp must remain as is */
     109        /* tp must remain as is */
    75110        /* t0 is used for temporary values */
    76         mv      t0, x0
    77 
    78         /* x31 contains the stack pointer */
    79         mv      x31, sp
    80 
    81         .macro  fill_register reg
    82         addi    t0,     t0,  1
    83         mv      \reg,   t0
     111        addi    t1, a0, 2
     112        addi    t2, a0, 3
     113        addi    s0, a0, 4
     114        addi    s1, a0, 5
     115        /* a0 is the pattern */
     116        addi    a1, a0, 6
     117        addi    a2, a0, 7
     118        addi    a3, a0, 8
     119        addi    a4, a0, 9
     120        addi    a5, a0, 10
     121        addi    a6, a0, 11
     122        addi    a7, a0, 12
     123        addi    s2, a0, 13
     124        addi    s3, a0, 14
     125        addi    s4, a0, 15
     126        addi    s5, a0, 16
     127        addi    s6, a0, 17
     128        addi    s7, a0, 18
     129        addi    s8, a0, 19
     130        addi    s9, a0, 20
     131        addi    s10, a0, 21
     132        addi    s11, a0, 22
     133        addi    t3, a0, 23
     134
     135        xor     t4, sp, a0
     136        xor     t5, gp, a0
     137        xor     t6, tp, a0
     138
     139        /* Check */
     140.Lcheck:
     141        .macro  check_register reg, inc
     142        addi    t0, a0, \inc
     143        bne     \reg, t0, .Lrestore
    84144        .endm
    85145
    86         fill_register   x1
    87         fill_register   x2
    88         fill_register   x3
    89         fill_register   x4
    90         fill_register   x5
    91         fill_register   x6
    92         fill_register   x7
    93         fill_register   x8
    94         fill_register   x9
    95         fill_register   x10
    96         fill_register   x11
    97         fill_register   x12
    98         fill_register   x13
    99         fill_register   x14
    100         fill_register   x15
    101         fill_register   x16
    102         fill_register   x17
    103         fill_register   x18
    104         fill_register   x19
    105         fill_register   x20
    106         fill_register   x21
    107         fill_register   x22
    108         fill_register   x23
    109         fill_register   x24
    110         fill_register   x25
    111         fill_register   x26
    112         fill_register   x27
    113         fill_register   x28
    114         fill_register   x29
    115         fill_register   x30
    116         fill_register   x31
    117 
    118         /* Check */
    119 check:
    120 
    121         .macro  check_register reg
    122         addi    t0, t0, 1
    123         bne     \reg, t0, restore
    124         .endm
    125 
    126         bne     x31, sp, restore
    127 
    128         mv      t0, x0
    129 
    130         check_register  x1
    131         check_register  x2
    132         check_register  x3
    133         check_register  x4
    134         check_register  x5
    135         check_register  x6
    136         check_register  x7
    137         check_register  x8
    138         check_register  x9
    139         check_register  x10
    140         check_register  x11
    141         check_register  x12
    142         check_register  x13
    143         check_register  x14
    144         check_register  x15
    145         check_register  x16
    146         check_register  x17
    147         check_register  x18
    148         check_register  x19
    149         check_register  x20
    150         check_register  x21
    151         check_register  x22
    152         check_register  x23
    153         check_register  x24
    154         check_register  x25
    155         check_register  x26
    156         check_register  x27
    157         check_register  x28
    158         check_register  x29
    159         check_register  x30
    160         check_register  x31
    161 
    162         j       check
     146        check_register  ra, 1
     147        check_register  t1, 2
     148        check_register  t2, 3
     149        check_register  s0, 4
     150        check_register  s1, 5
     151        check_register  a1, 6
     152        check_register  a2, 7
     153        check_register  a3, 8
     154        check_register  a4, 9
     155        check_register  a5, 10
     156        check_register  a6, 11
     157        check_register  a7, 12
     158        check_register  s2, 13
     159        check_register  s3, 14
     160        check_register  s4, 15
     161        check_register  s5, 16
     162        check_register  s6, 17
     163        check_register  s7, 18
     164        check_register  s8, 19
     165        check_register  s9, 20
     166        check_register  s10, 21
     167        check_register  s11, 22
     168        check_register  t3, 23
     169
     170        xor     t0, sp, a0
     171        bne     t4, t0, .Lrestore
     172
     173        xor     t0, gp, a0
     174        bne     t5, t0, .Lrestore
     175
     176        xor     t0, tp, a0
     177        bne     t6, t0, .Lrestore
     178
     179        j       .Lcheck
    163180
    164181        /* Restore */
    165 restore:
    166         LREG    x1, (1 * CPU_SIZEOF_POINTER)(sp)
    167         /* Skip sp/x2 */
    168         LREG    x3, (3 * CPU_SIZEOF_POINTER)(sp)
    169         LREG    x4, (4 * CPU_SIZEOF_POINTER)(sp)
    170         LREG    x5, (5 * CPU_SIZEOF_POINTER)(sp)
    171         LREG    x6, (6 * CPU_SIZEOF_POINTER)(sp)
    172         LREG    x7, (7 * CPU_SIZEOF_POINTER)(sp)
    173         LREG    x8, (8 * CPU_SIZEOF_POINTER)(sp)
    174         LREG    x9, (9 * CPU_SIZEOF_POINTER)(sp)
    175         LREG    x10, (10 * CPU_SIZEOF_POINTER)(sp)
    176         LREG    x11, (11 * CPU_SIZEOF_POINTER)(sp)
    177         LREG    x12, (12 * CPU_SIZEOF_POINTER)(sp)
    178         LREG    x13, (13 * CPU_SIZEOF_POINTER)(sp)
    179         LREG    x14, (14 * CPU_SIZEOF_POINTER)(sp)
    180         LREG    x15, (15 * CPU_SIZEOF_POINTER)(sp)
    181         LREG    x16, (16 * CPU_SIZEOF_POINTER)(sp)
    182         LREG    x17, (17 * CPU_SIZEOF_POINTER)(sp)
    183         LREG    x18, (18 * CPU_SIZEOF_POINTER)(sp)
    184         LREG    x19, (19 * CPU_SIZEOF_POINTER)(sp)
    185         LREG    x20, (20 * CPU_SIZEOF_POINTER)(sp)
    186         LREG    x21, (21 * CPU_SIZEOF_POINTER)(sp)
    187         LREG    x22, (22 * CPU_SIZEOF_POINTER)(sp)
    188         LREG    x23, (23 * CPU_SIZEOF_POINTER)(sp)
    189         LREG    x24, (24 * CPU_SIZEOF_POINTER)(sp)
    190         LREG    x25, (25 * CPU_SIZEOF_POINTER)(sp)
    191         LREG    x26, (26 * CPU_SIZEOF_POINTER)(sp)
    192         LREG    x27, (27 * CPU_SIZEOF_POINTER)(sp)
    193         LREG    x28, (28 * CPU_SIZEOF_POINTER)(sp)
    194         LREG    x29, (29 * CPU_SIZEOF_POINTER)(sp)
    195         LREG    x30, (30 * CPU_SIZEOF_POINTER)(sp)
    196 
    197         LREG    x31, (31 * CPU_SIZEOF_POINTER)(sp)
    198 
    199         addi    sp, sp, 36 * CPU_SIZEOF_POINTER
     182.Lrestore:
     183        LREG    ra, RA_OFFSET(sp)
     184        LREG    t0, T0_OFFSET(sp)
     185        LREG    t1, T1_OFFSET(sp)
     186        LREG    t2, T2_OFFSET(sp)
     187        LREG    s0, S0_OFFSET(sp)
     188        LREG    s1, S1_OFFSET(sp)
     189        LREG    a0, A0_OFFSET(sp)
     190        LREG    a1, A1_OFFSET(sp)
     191        LREG    a2, A2_OFFSET(sp)
     192        LREG    a3, A3_OFFSET(sp)
     193        LREG    a4, A4_OFFSET(sp)
     194        LREG    a5, A5_OFFSET(sp)
     195        LREG    a6, A6_OFFSET(sp)
     196        LREG    a7, A7_OFFSET(sp)
     197        LREG    s2, S2_OFFSET(sp)
     198        LREG    s3, S3_OFFSET(sp)
     199        LREG    s4, S4_OFFSET(sp)
     200        LREG    s5, S5_OFFSET(sp)
     201        LREG    s6, S6_OFFSET(sp)
     202        LREG    s7, S7_OFFSET(sp)
     203        LREG    s8, S8_OFFSET(sp)
     204        LREG    s9, S9_OFFSET(sp)
     205        LREG    s10, S10_OFFSET(sp)
     206        LREG    s11, S11_OFFSET(sp)
     207        LREG    t3, T3_OFFSET(sp)
     208        LREG    t4, T4_OFFSET(sp)
     209        LREG    t5, T5_OFFSET(sp)
     210        LREG    t6, T6_OFFSET(sp)
     211
     212        addi    sp, sp, FRAME_SIZE
    200213        ret
Note: See TracChangeset for help on using the changeset viewer.