Skip to content

Commit 9575bae

Browse files
committed
Publish draft of 'RISC-V from scratch' part one
1 parent e5b8062 commit 9575bae

17 files changed

+901
-0
lines changed

Diff for: .gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
_site
2+
.sass-cache

Diff for: _config.yml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Site settings
2+
title: twilco
3+
4+
description: > # this means to ignore newlines until "baseurl:"
5+
baseurl: "" # the subpath of your site, e.g. /blog/
6+
url: "https://github.com/twilco" # the base hostname & protocol for your site
7+
twitter_username: tylerwilcock
8+
github_username: twilco
9+
10+
# Build settings
11+
markdown: kramdown

Diff for: _includes/footer.html

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<footer class="site-footer">
2+
3+
<div class="wrapper">
4+
5+
<h2 class="footer-heading">{{ site.title }}</h2>
6+
7+
<div class="footer-col-wrapper">
8+
<div class="footer-col footer-col-1">
9+
<ul class="contact-list">
10+
{% comment %} <li>{{ site.title }}</li> {% endcomment %}
11+
<li><a href="mailto:{{ site.email }}">{{ site.email }}</a></li>
12+
</ul>
13+
</div>
14+
15+
<div class="footer-col footer-col-2">
16+
<ul class="social-media-list">
17+
{% if site.github_username %}
18+
<li>
19+
<a href="https://github.com/{{ site.github_username }}">
20+
<span class="icon icon--github">
21+
<svg viewBox="0 0 16 16">
22+
<path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/>
23+
</svg>
24+
</span>
25+
26+
<span class="username">{{ site.github_username }}</span>
27+
</a>
28+
</li>
29+
{% endif %}
30+
31+
{% if site.twitter_username %}
32+
<li>
33+
<a href="https://twitter.com/{{ site.twitter_username }}">
34+
<span class="icon icon--twitter">
35+
<svg viewBox="0 0 16 16">
36+
<path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809
37+
c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/>
38+
</svg>
39+
</span>
40+
41+
<span class="username">{{ site.twitter_username }}</span>
42+
</a>
43+
</li>
44+
{% endif %}
45+
</ul>
46+
</div>
47+
48+
<div class="footer-col footer-col-3">
49+
<p class="text">{{ site.description }}</p>
50+
</div>
51+
</div>
52+
53+
</div>
54+
55+
</footer>

Diff for: _includes/head.html

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<head>
2+
<meta charset="utf-8">
3+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
4+
<meta name="viewport" content="width=device-width, initial-scale=1">
5+
6+
<title>{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}</title>
7+
<meta name="description" content="{% if page.excerpt %}{{ page.excerpt | strip_html | strip_newlines | truncate: 160 }}{% else %}{{ site.description }}{% endif %}">
8+
9+
<link rel="stylesheet" href="{{ "/css/main.css" | prepend: site.baseurl }}">
10+
<link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site.baseurl | prepend: site.url }}">
11+
<link rel="alternate" type="application/rss+xml" title="{{ site.title }}" href="{{ "/feed.xml" | prepend: site.baseurl | prepend: site.url }}" />
12+
</head>

Diff for: _includes/header.html

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<header class="site-header">
2+
3+
<div class="wrapper">
4+
5+
<a class="site-title" href="{{ site.baseurl }}/">{{ site.title }}</a>
6+
7+
<nav class="site-nav">
8+
<a href="#" class="menu-icon">
9+
<svg viewBox="0 0 18 15">
10+
<path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
11+
<path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
12+
<path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
13+
</svg>
14+
</a>
15+
16+
<div class="trigger">
17+
{% for page in site.pages %}
18+
{% if page.title %}
19+
<a class="page-link" href="{{ page.url | prepend: site.baseurl }}">{{ page.title }}</a>
20+
{% endif %}
21+
{% endfor %}
22+
</div>
23+
</nav>
24+
25+
</div>
26+
27+
</header>

Diff for: _layouts/default.html

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<!DOCTYPE html>
2+
<html>
3+
4+
{% include head.html %}
5+
6+
<body>
7+
8+
{% include header.html %}
9+
10+
<div class="page-content">
11+
<div class="wrapper">
12+
{{ content }}
13+
</div>
14+
</div>
15+
16+
{% include footer.html %}
17+
18+
</body>
19+
20+
</html>

Diff for: _layouts/page.html

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
layout: default
3+
---
4+
<div class="post">
5+
6+
<header class="post-header">
7+
<h1 class="post-title">{{ page.title }}</h1>
8+
</header>
9+
10+
<article class="post-content">
11+
{{ content }}
12+
</article>
13+
14+
</div>

Diff for: _layouts/post.html

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
layout: default
3+
---
4+
<div class="post">
5+
6+
<header class="post-header">
7+
<h1 class="post-title">{{ page.title }}</h1>
8+
<p class="post-meta">{{ page.date | date: "%b %-d, %Y" }}{% if page.author %} • {{ page.author }}{% endif %}{% if page.meta %} • {{ page.meta }}{% endif %}</p>
9+
</header>
10+
11+
<article class="post-content">
12+
{{ content }}
13+
</article>
14+
15+
</div>

Diff for: _posts/2019-03-10-intro-to-riscv.markdown

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
---
2+
layout: post
3+
title: "RISC-V from scratch 1: Introduction, toolchain setup, and hello world!"
4+
date: 2019-03-10 12:42:53
5+
categories: riscv toolchain
6+
---
7+
8+
Welcome to part one of *RISC-V from scratch!* Throughout this series, we will utilize RISC-V and it's ecosystem to explore various low-level tools and concepts, such as linkers, runtimes and startup routines, assembly, and lots more. I am a web developer by trade, and as such I'm not exposed to these things on a daily basis. However, I think they are very interesting - hence this series! Join me on a very much unstructured journey into the depths of all things low-level.
9+
10+
In this first post, we'll talk a little bit about what RISC-V is, why it's important, and finish up by setting up a RISC-V toolchain and building and running a simple RISC-V program.
11+
12+
### So what is RISC-V?
13+
14+
RISC-V is an open-source, free-to-use ISA that began as a project at UC-Berkeley in 2010. The free-to-use aspect has been instrumental in its success and is quite a stark contrast to many other architectures. Take ARM for example - in order to create an ARM-compatible processor, you must pay an upfront fee of [$1M - $10M as well as a 0.5% - 2% royalty fee per-chip](https://www.anandtech.com/show/7112/the-arm-diaries-part-1-how-arms-business-model-works/2). This free and open model makes RISC-V an attractive option to many groups of people - hardware startups who can't foot the bill to create an ARM (or whatever other) processor, academic institutions, and (obviously) the open-source community.
15+
16+
RISC-V's meteoric rise in popularity hasn't gone unnoticed. [ARM launched a now-taken down website](https://abopen.com/news/rattled-arm-launches-anti-risc-v-marketing-campaign/) that attempted (rather unsuccessfully) to highlight supposed benefits of ARM over RISC-V. RISC-V is backed by [a ton of major companies](https://riscv.org/members-at-a-glance/), including Google, Nvidia, and Western Digital.
17+
18+
### QEMU and RISC-V toolchain setup
19+
20+
We won't be able to run any code on a RISC-V processor until we have an environment to do it in. Fortunately, we don't need a physical RISC-V processor to do this - we'll instead be using [qemu-riscv](https://github.com/riscv/riscv-qemu/wiki). Follow the install instructions for your operating system [here](https://github.com/riscv/riscv-qemu/wiki#build-and-install). I'm using MacOS, so for me this was as easy as:
21+
22+
{% highlight bash %}
23+
# create a directory to put our risc-v emulators, toolchain, etc
24+
mkdir -p ~/usys/riscv && cd ~/usys/riscv
25+
git clone --recursive https://github.com/riscv/riscv-qemu.git
26+
cd riscv-qemu
27+
./configure \
28+
--target-list=riscv64-softmmu,riscv32-softmmu
29+
make -j$(nproc)
30+
make install
31+
{% endhighlight %}
32+
33+
The instance of `qemu` we just built comes with [a few machines](https://github.com/riscv/riscv-qemu/wiki#machines) (specified via the `qemu-system-riscv32 -machine` option) ready to go, which is a nice convenience.
34+
35+
Next, let's install a RISC-V compatible copy of [OpenOCD](http://openocd.org/) and the RISC-V toolchain.
36+
37+
1. Download prebuilt versions of the RISC-V OpenOCD and the RISC-V toolchain from here: <https://www.sifive.com/boards>
38+
2. Move and extract these files into the `~/usys/riscv` directory we created earlier.
39+
{% highlight bash %}
40+
cp openocd-<date>-<platform>.tar.gz ~/usys/riscv
41+
cp riscv64-unknown-elf-gcc-<date>-<platform>.tar.gz ~/usys/riscv
42+
cd ~/usys/riscv
43+
tar -xvf openocd-<date>-<platform>.tar.gz
44+
tar -xvf riscv64-unknown-elf-gcc-<date>-<platform>.tar.gz
45+
{% endhighlight %}
46+
{:start="3"}
47+
3. Set the `RISCV_OPENOCD_PATH` and `RISCV_PATH` environment variables so other programs can find our toolchain. This may look different depending on your OS and shell - I had to add these exports to my `~/.zshenv` file.
48+
49+
{% highlight bash %}
50+
# I put these two exports directly in my ~/.zshenv file - you may have to do something else.
51+
export RISCV_OPENOCD_PATH="$HOME/usys/riscv/openocd-<date>-<version>"
52+
export RISCV_PATH="$HOME/usys/riscv/riscv64-unknown-elf-gcc-<date>-<version>"
53+
# Reload .zshenv with our new environment variables. Restarting your shell will have a similar effect.
54+
source ~/.zshenv
55+
{% endhighlight %}
56+
57+
{:start="4"}
58+
4. We'll also create a symbolic link into `/usr/local/bin` for this executable so that we can run it without specifying the full path to `~/usys/riscv/riscv64-unknown-elf-gcc-<date>-<version>/bin/riscv64-unknown-elf-gcc` whenever we want to use it.
59+
60+
{% highlight bash %}
61+
# Symbolically link our gcc executable into /usr/local/bin. Repeat this process for any other executables you want to quickly access.
62+
ln -s ~/usys/riscv/riscv64-unknown-elf-gcc-8.2.0-<date>-<version>/bin/riscv64-unknown-elf-gcc /usr/local/bin
63+
{% endhighlight %}
64+
65+
Et voilà, we have a working RISC-V toolchain! All our executables, such as `riscv64-unknown-elf-gcc`, `riscv64-unknown-elf-gdb`, `riscv64-unknown-elf-ld`, etc, are located in `~/usys/riscv/riscv64-unknown-elf-gcc-<date>-<version>/bin/`.
66+
67+
### Hello, RISC-V!
68+
69+
Now that we have our toolchain setup, let's run an example RISC-V program. I previously linked a SiFive repository called [freedom-e-sdk](https://github.com/sifive/freedom-e-sdk), which provides various programs we can try out. Begin by recursively cloning this repository:
70+
71+
{% highlight bash %}
72+
cd ~/wherever/you/want/to/clone/this
73+
git clone --recursive https://github.com/sifive/freedom-e-sdk.git
74+
cd freedom-e-sdk
75+
{% endhighlight %}
76+
77+
And then compile all the example programs they provide:
78+
79+
{% highlight bash %}
80+
make software
81+
{% endhighlight %}
82+
83+
And we should (finally) be all set! [As is tradition](https://stackoverflow.com/a/12785204), let's start with the "Hello, world" program provided by `freedom-e-sdk`.
84+
85+
{% highlight bash %}
86+
07:38:47 PM twilcock ( master | … )
87+
~/projects/freedom-e-sdk
88+
$ qemu-system-riscv32 -nographic -machine sifive_e -kernel software/hello/hello
89+
Hello, World!
90+
{% endhighlight %}
91+
92+
### What's next?
93+
94+
This is a great start, but my goal with these blog posts is to truly [shave the yak](https://seths.blog/2005/03/dont_shave_that/), and while we have confirmed that we have a working toolchain, there is a lot of magic hidden by the niceties of the `freedom-e-sdk` examples. Note that we didn't have to set up any linker files or startup code - SiFive's provided board-support linker scripts, various Makefiles, and the [freedom-metal library](https://github.com/sifive/freedom-metal) take care of this for us.
95+
96+
In part two of this series we'll make our own way by creating our own linker file and a basic runtime to get us to `main()`. We will also begin exploring some basic RISC-V assembly.

Diff for: _posts/2019-03-10-welcome-to-jekyll.markdown

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
layout: post
3+
title: "Welcome to Jekyll!"
4+
date: 2019-03-10 12:42:53
5+
categories: jekyll update
6+
---
7+
You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated.
8+
9+
To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.
10+
11+
Jekyll also offers powerful support for code snippets:
12+
13+
{% highlight ruby %}
14+
def print_hi(name)
15+
puts "Hi, #{name}"
16+
end
17+
print_hi('Tom')
18+
#=> prints 'Hi, Tom' to STDOUT.
19+
{% endhighlight %}
20+
21+
Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll’s dedicated Help repository][jekyll-help].
22+
23+
[jekyll]: http://jekyllrb.com
24+
[jekyll-gh]: https://github.com/jekyll/jekyll
25+
[jekyll-help]: https://github.com/jekyll/jekyll-help

0 commit comments

Comments
 (0)