zx/fdio/vmo: implement ReadAt

Change-Id: I5bd6a200ef96bbda8934755f58a9f35e43a4715c
diff --git a/src/syscall/zx/fdio/vmo.go b/src/syscall/zx/fdio/vmo.go
index c069d14..19018de 100644
--- a/src/syscall/zx/fdio/vmo.go
+++ b/src/syscall/zx/fdio/vmo.go
@@ -45,8 +45,27 @@
 	return n, err
 }
 
-func (f *VMOFile) ReadAt(data []byte, off int64) (int, error) {
-	panic("TODO")
+func (f *VMOFile) ReadAt(data []byte, off int64) (n int, err error) {
+	if off < 0 {
+		return 0, zx.Error{Status: zx.ErrInvalidArgs, Text: "fdio.VMOFile.ReadAt"}
+	}
+	if off >= f.end {
+		return 0, zx.EOF
+	}
+	if len(data) == 0 {
+		return 0, zx.EOF
+	}
+	n = len(data)
+	max := int(f.end - off)
+	if max < n {
+		n = max
+		err = zx.EOF
+	}
+	data = data[:n]
+	if n2, err2 := f.h.Read(data, uint64(off)); err2 != nil {
+		return n2, err2
+	}
+	return
 }
 
 func (f *VMOFile) Write(data []byte) (int, error) {