aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/spike-openocd-tests.yml
blob: 71bf29a4bf77ebb799de8956adea46c238031641 (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
# 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
  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
  pull_request:
    types: [synchronize, opened, reopened]

# 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-latest
    steps:
      - uses: actions/checkout@v4

      - 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" master | awk '{ print $1; }' )
          RISC_V_TESTS_COMMIT=$( git ls-remote "$RISCV_TESTS_REPO" master | awk '{ print $1; }' )
          echo "Revison of Spike: $SPIKE_COMMIT"
          echo "Revision of RISC-V tests: $RISC_V_TESTS_COMMIT"
          # Save for later use
          echo "SPIKE_COMMIT=$SPIKE_COMMIT" >> $GITHUB_ENV
          echo "RISC_V_TESTS_COMMIT=$RISC_V_TESTS_COMMIT" >> $GITHUB_ENV

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

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

      - if: ${{ steps.cache-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-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

      - if: ${{ steps.cache-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-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

      - name: Build OpenOCD
        run: |
          #cd riscv-openocd
          ./bootstrap
          ./configure --prefix=/opt/riscv
          make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
          ls -l src/openocd

#      - name: Download OpenOCD
#        run: |
#          git clone --recurse-submodules https://github.com/riscv/riscv-openocd.git
#          cd riscv-openocd
#          git checkout 43ea20dfbb6c815004a51106a3b2009d7f6c4940

      - name: Download Tests
        run: |
          git clone "$RISCV_TESTS_REPO"
          cd riscv-tests
          git checkout "$RISCV_TESTS_REV"
          git submodule update --init --recursive

      - name: Run Spike32 Tests
        id: spike32-tests
        run: |
          cd riscv-tests/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 $GITHUB_WORKSPACE/src/openocd

      - name: Run Spike64-2 Tests
        if: success() || steps.spike32-tests.conclusion == 'failure'
        run: |
          cd riscv-tests/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 $GITHUB_WORKSPACE/src/openocd

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