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.

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

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


BOCHS

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

    $ cp dot-bochsrc .bochsrc
    $ $EDITOR .bochsrc # tweak it if required
    $ bochs


ORACLE xVM VIRTUALBOX

Install VirtualBox. Then:

    Build 'disk' (described above under '386').

    $ VBoxManage convertfromraw disk go-tiny.vdi
    $ VirtualBox
        create a new VM; as disk use the go-tiny.vdi image.
        start the vm.


QEMU / KVM

This should work the same for qemu and kvm (really: qemu-kvm).

    Build 'disk' (described above under '386').

    $ qemu -hda disk


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/

