aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/spike-openocd-tests.yml
blob: 577bd951159f1f5d396d2be7525c45a6f1c187e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# Build Spike and run a couple of debug tests.

name: Test OpenOCD against 2 spike configurations

env:
  SPIKE_REPO: https://github.com/riscv-software-src/riscv-isa-sim.git
  SPIKE_REV: master
  RISCV_TESTS_REPO: https://github.com/riscv-software-src/riscv-tests.git
  RISCV_TESTS_REV: master
  OPENOCD_REPO: https://github.com/riscv/riscv-openocd.git
  OPENOCD_REV: riscv
  TOOLCHAIN_URL: https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v12.2.0-1/xpack-riscv-none-elf-gcc-12.2.0-1-linux-x64.tar.gz

on:
  # Run on merges to master to populate the cache with entities that are
  # accessible by every pull request.
  push:
    branches:
      - riscv
    paths:
    - 'debug/**'
    - '.github/workflows/spike-openocd-tests.yml'
  pull_request:
    types: [synchronize, opened, reopened]
    paths:
    - 'debug/**'
    - '.github/workflows/spike-openocd-tests.yml'

# There is some commented out code below that would be useful in adding this
# workflow to other repos. Ideally we can come up with something that would
# leave this file almost identical between repos, so they can all easily run
# this test suite.

jobs:
  test:
    name: Test debug (Ubuntu)
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get install -y device-tree-compiler build-essential

      - name: Get revisions of dependencies
        run: |
          SPIKE_COMMIT=$( git ls-remote "$SPIKE_REPO" $SPIKE_REV | awk '{ print $1; }' )
          OPENOCD_COMMIT=$( git ls-remote "$OPENOCD_REPO" $OPENOCD_REV | awk '{ print $1; }' )
          echo "Revison of Spike: $SPIKE_COMMIT"
          echo "Revision of OpenOCD: $OPENOCD_COMMIT"
          # Save for later use
          echo "SPIKE_COMMIT=$SPIKE_COMMIT" >> $GITHUB_ENV
          echo "OPENOCD_COMMIT=$OPENOCD_COMMIT" >> $GITHUB_ENV

      - name: Get the toolchain from cache (if available)
        id: cache-restore-toolchain
        uses: actions/cache/restore@v3
        with:
          path: /opt/riscv/toolchain
          key: "toolchain-${{env.TOOLCHAIN_URL}}"

      - if: ${{ steps.cache-restore-toolchain.outputs.cache-hit != 'true' }}
        name: Download Toolchain (if not cached)
        run: |
          mkdir -p /opt/riscv/toolchain
          wget --progress=dot:giga $TOOLCHAIN_URL -O /tmp/toolchain.tar.gz

      - if: ${{ steps.cache-restore-toolchain.outputs.cache-hit != 'true' }}
        name: Install Toolchain (if not cached)
        run: tar zxf /tmp/toolchain.tar.gz --strip-components=1 -C /opt/riscv/toolchain

      - name: Save the toolchain to the cache (if necessary)
        id: cache-save-toolchain
        uses: actions/cache/save@v3
        with:
          path: /opt/riscv/toolchain
          key: "toolchain-${{env.TOOLCHAIN_URL}}"

      - name: Get OpenOCD from cache (if available)
        id: cache-restore-openocd
        uses: actions/cache/restore@v3
        with:
          path: /opt/riscv/openocd
          key: "openocd-${{env.OPENOCD_COMMIT}}"

      - if: ${{ steps.cache-restore-openocd.outputs.cache-hit != 'true' }}
        name: Download OpenOCD source (if not cached)
        run: |
          git clone "$OPENOCD_REPO"
          cd riscv-openocd
          git checkout "$OPENOCD_COMMIT"
          git submodule update --init --recursive

      - if: ${{ steps.cache-restore-openocd.outputs.cache-hit != 'true' }}
        name: Build OpenOCD (if not cached)
        run: |
          cd riscv-openocd
          ./bootstrap
          ./configure --prefix=/opt/riscv/openocd
          make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
          make install

      - if: ${{ steps.cache-restore-openocd.outputs.cache-hit != 'true' }}
        name: Save OpenOCD to cache (if built)
        id: cache-save-openocd
        uses: actions/cache/save@v3
        with:
          path: /opt/riscv/openocd
          key: "openocd-${{env.OPENOCD_COMMIT}}"

      - name: Get spike from cache (if available)
        id: cache-restore-spike
        uses: actions/cache/restore@v3
        with:
          path: /opt/riscv/spike
          key: "spike-${{env.SPIKE_COMMIT}}"

      - if: ${{ steps.cache-restore-spike.outputs.cache-hit != 'true' }}
        name: Download Spike source (if not cached)
        run: |
          git clone "$SPIKE_REPO"
          cd riscv-isa-sim
          git checkout "$SPIKE_COMMIT"
          git submodule update --init --recursive

      - if: ${{ steps.cache-restore-spike.outputs.cache-hit != 'true' }}
        name: Build Spike (if not cached)
        run: |
          cd riscv-isa-sim
          mkdir build && cd build
          ../configure --prefix=/opt/riscv/spike
          make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
          make install

      - if: ${{ steps.cache-restore-spike.outputs.cache-hit != 'true' }}
        name: Save spike to cache (if built)
        id: cache-save-spike
        uses: actions/cache/save@v3
        with:
          path: /opt/riscv/spike
          key: "spike-${{env.SPIKE_COMMIT}}"

      - name: Run Spike32 Tests
        id: spike32-tests
        run: |
          cd debug
          ./gdbserver.py targets/RISC-V/spike32.py --print-failures \
              --gcc /opt/riscv/toolchain/bin/riscv-none-elf-gcc \
              --gdb /opt/riscv/toolchain/bin/riscv-none-elf-gdb \
              --sim_cmd /opt/riscv/spike/bin/spike \
              --server_cmd /opt/riscv/openocd/bin/openocd

      - name: Run Spike64-2 Tests
        if: success() || steps.spike32-tests.conclusion == 'failure'
        run: |
          cd debug
          ./gdbserver.py targets/RISC-V/spike64-2.py --print-failures \
              --gcc /opt/riscv/toolchain/bin/riscv-none-elf-gcc \
              --gdb /opt/riscv/toolchain/bin/riscv-none-elf-gdb \
              --sim_cmd /opt/riscv/spike/bin/spike \
              --server_cmd /opt/riscv/openocd/bin/openocd

      - name: Archive test logs
        # Proceed even if there was a failed test
        if: ${{ success() || failure() }}
        uses: actions/upload-artifact@v3
        with:
          name: test-logs
          path: riscv-tests/debug/logs