1
0
mirror of https://github.com/taigrr/gopher-os synced 2025-01-18 04:43:13 -08:00

Merge pull request #35 from achilleasa/bootstrap-interfaces-and-map-primitive

Enable support for interfaces and the map primitive
This commit is contained in:
Achilleas Anagnostopoulos 2017-06-30 18:35:10 +01:00 committed by GitHub
commit 7b93d01c6e
2 changed files with 61 additions and 0 deletions

View File

@ -16,8 +16,27 @@ var (
earlyReserveRegionFn = vmm.EarlyReserveRegion
frameAllocFn = allocator.AllocFrame
mallocInitFn = mallocInit
algInitFn = algInit
modulesInitFn = modulesInit
typeLinksInitFn = typeLinksInit
itabsInitFn = itabsInit
// A seed for the pseudo-random number generator used by getRandomData
prngSeed = 0xdeadc0de
)
//go:linkname algInit runtime.alginit
func algInit()
//go:linkname modulesInit runtime.modulesinit
func modulesInit()
//go:linkname typeLinksInit runtime.typelinksinit
func typeLinksInit()
//go:linkname itabsInit runtime.itabsinit
func itabsInit()
//go:linkname mallocInit runtime.mallocinit
func mallocInit()
@ -121,11 +140,30 @@ func nanotime() uint64 {
return 1
}
// getRandomData populates the given slice with random data. The implementation
// is the runtime package reads a random stream from /dev/random but since this
// is not available, we use a prng instead.
//
//go:redirect-from runtime.getRandomData
func getRandomData(r []byte) {
for i := 0; i < len(r); i++ {
prngSeed = (prngSeed * 58321) + 11113
r[i] = byte((prngSeed >> 16) & 255)
}
}
// Init enables support for various Go runtime features. After a call to init
// the following runtime features become available for use:
// - heap memory allocation (new, make e.t.c)
// - map primitives
// - interfaces
func Init() *kernel.Error {
mallocInitFn()
algInitFn() // setup hash implementation for map keys
modulesInitFn() // provides activeModules
typeLinksInitFn() // uses maps, activeModules
itabsInitFn() // uses activeModules
return nil
}
@ -141,5 +179,6 @@ func init() {
sysReserve(zeroPtr, 0, &reserved)
sysMap(zeroPtr, 0, reserved, &stat)
sysAlloc(0, &stat)
getRandomData(nil)
stat = nanotime()
}

View File

@ -1,6 +1,7 @@
package goruntime
import (
"reflect"
"testing"
"unsafe"
@ -236,11 +237,32 @@ func TestSysAlloc(t *testing.T) {
})
}
func TestGetRandomData(t *testing.T) {
sample1 := make([]byte, 128)
sample2 := make([]byte, 128)
getRandomData(sample1)
getRandomData(sample2)
if reflect.DeepEqual(sample1, sample2) {
t.Fatal("expected getRandomData to return different values for each invocation")
}
}
func TestInit(t *testing.T) {
defer func() {
mallocInitFn = mallocInit
algInitFn = algInit
modulesInitFn = modulesInit
typeLinksInitFn = typeLinksInit
itabsInitFn = itabsInit
}()
mallocInitFn = func() {}
algInitFn = func() {}
modulesInitFn = func() {}
typeLinksInitFn = func() {}
itabsInitFn = func() {}
if err := Init(); err != nil {
t.Fatal(t)