From 49b78a4b75b527b78ffcbdfbf8185709b4503e20 Mon Sep 17 00:00:00 2001 From: mappu Date: Wed, 28 Dec 2022 14:11:23 +1300 Subject: [PATCH] eei/virtualeei: implement io.WriterAt --- cmd/riscvrun/main.go | 5 ++++- virtualEei.go | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/cmd/riscvrun/main.go b/cmd/riscvrun/main.go index dffac15..3ad4779 100644 --- a/cmd/riscvrun/main.go +++ b/cmd/riscvrun/main.go @@ -26,7 +26,10 @@ func main() { if err != nil { panic(err) } - copy(sw.Ram[*loadAddress:*loadAddress+len(fb)], fb) + _, err = sw.WriteAt(fb, *loadAddress) + if err != nil { + panic(err) + } c := riscvemu.NewCPU(&sw) c.Pc = uint32(*loadAddress) diff --git a/virtualEei.go b/virtualEei.go index 0c82df9..01f0f34 100644 --- a/virtualEei.go +++ b/virtualEei.go @@ -63,6 +63,25 @@ func (ve *VirtualEEI) Write32(addr, value uint32) error { return nil } +// WriteAt implements the io.WriterAt interface on top of the EEI's virtual memory. +func (ve *VirtualEEI) WriteAt(p []byte, off int64) (n int, err error) { + if off < 0 || off >= math.MaxUint32 { + return 0, os.ErrInvalid + } + + addr := uint32(off) // bounds-checked + + // TODO do something more optimized + for i, bb := range p { + err := ve.WriteByte(addr+uint32(i), bb) + if err != nil { + return i, err + } + } + + return len(p), nil +} + func (ve *VirtualEEI) Syscall() { panic("syscall") }