This directory contains a simple example of how one might
start Go running on bare hardware. There is currently code
for 386 and arm.


386

It is very primitive but can run go/test/sieve.go, the concurrent
prime sieve, on a uniprocessor.  It has only been tested using the
Bochs emulator.

To run, first build the tools by running all.bash with GOARCH=386
and GOOS set to your normal GOOS (linux, darwin).  Then:

	export GOOS=tiny
	cd $GOROOT/src/pkg/runtime
	make clean
	make install
	cd tiny
	8g $GOROOT/test/sieve.go
	8l sieve.8
	8l -a sieve.8 >sieve.asm	# can consult sieve.asm for debugging
	dd if=/dev/zero of=disk count=10000
	cat bootblock 8.out | dd of=disk conv=notrunc
	bochs

Use the built-in print(text string) function to print to the
console.

You may have to tweak the .bochsrc depending on your system,
and you may need to install the Bochs emulator.


ARM

First build the toolchain using GOARCH=arm and GOOS=linux. When
you build your embedded code set GOARCH=tiny.

	export GOOS=tiny
	cd $GOROOT/src/pkg/runtime
	make clean
	make install

On arm the tiny runtime doesn't define a low level write function. You can either
define a stub if you don't need debug output, or more usefully, define it to
print to some debug serial port. Here is a sample function that prints to
the DBGU on an at91sam7s:

#define DBGU_CSR  ((uint32*)   0xFFFFF214) // (DBGU) Channel Status Register
#define US_TXRDY        ((uint32) 0x1 <<  1) // (DBGU) TXRDY Interrupt
#define DBGU_THR  ((uint32*)   0xFFFFF21C) // (DBGU) Transmitter Holding Register

int32
write(int32 fd, void* b, int32 n)
{
	uint32 i;
	uint8* s = (uint8*)b;

	for (i = 0; i < n; i++) {
		while ((*DBGU_CSR & US_TXRDY) == 0) {
		}
		*DBGU_THR = *s;
		s++;
	}
	return n;
}



The 386 bootblock is from MIT's xv6 project and carries this notice:

    The xv6 software is:
    
    Copyright (c) 2006-2009 Frans Kaashoek, Robert Morris, Russ Cox,
                            Massachusetts Institute of Technology
    
    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
    "Software"), to deal in the Software without restriction, including
    without limitation the rights to use, copy, modify, merge, publish,
    distribute, sublicense, and/or sell copies of the Software, and to
    permit persons to whom the Software is furnished to do so, subject to
    the following conditions:
    
    The above copyright notice and this permission notice shall be
    included in all copies or substantial portions of the Software.
    
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

http://pdos.csail.mit.edu/6.828/xv6/

