diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-02-18 16:38:45 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-02-19 21:48:20 +0100 |
| commit | 90fd6503136121e9494761a460898e83bc0b6b3e (patch) | |
| tree | 156c46c5612463440c5759658f143c7400ddc0fb /prog/encodingexec.go | |
| parent | 6e89f94756a282d0d7ae95d084d37f40d95dd392 (diff) | |
prog: fix PhysicalAddr for NULL addresses
Turns out we never produced NULL pointers because
what's meant to be NULL pointer was actually encoded
as pointer to beginning of the data region.
Diffstat (limited to 'prog/encodingexec.go')
| -rw-r--r-- | prog/encodingexec.go | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/prog/encodingexec.go b/prog/encodingexec.go index b5573f60f..ae885d3b1 100644 --- a/prog/encodingexec.go +++ b/prog/encodingexec.go @@ -193,16 +193,15 @@ func (p *Prog) SerializeForExec(buffer []byte) (int, error) { return len(buffer) - len(w.buf), nil } -func (target *Target) PhysicalAddr(arg Arg) uint64 { - a, ok := arg.(*PointerArg) - if !ok { - panic("physicalAddr: bad arg kind") +func (target *Target) PhysicalAddr(arg *PointerArg) uint64 { + if arg.Res == nil && arg.PagesNum == 0 { + return 0 } - addr := a.PageIndex*target.PageSize + target.DataOffset - if a.PageOffset >= 0 { - addr += uint64(a.PageOffset) + addr := arg.PageIndex*target.PageSize + target.DataOffset + if arg.PageOffset >= 0 { + addr += uint64(arg.PageOffset) } else { - addr += target.PageSize - uint64(-a.PageOffset) + addr += target.PageSize - uint64(-arg.PageOffset) } return addr } @@ -256,7 +255,7 @@ func (w *execContext) writeArg(arg Arg) { w.write(a.OpAdd) } case *PointerArg: - w.writeConstArg(a.Size(), w.target.PhysicalAddr(arg), 0, 0, 0, false) + w.writeConstArg(a.Size(), w.target.PhysicalAddr(a), 0, 0, 0, false) case *DataArg: data := a.Data() w.write(execArgData) |
