github.com/linuxboot/fiano@v1.2.0/pkg/cbfs/stage.go (about) 1 // Copyright 2018-2021 the LinuxBoot Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package cbfs 6 7 import ( 8 "encoding/json" 9 "fmt" 10 "io" 11 "log" 12 ) 13 14 func init() { 15 if err := RegisterFileReader(&SegReader{Type: TypeLegacyStage, Name: "LegacyStage", New: NewLegacyStageRecord}); err != nil { 16 log.Fatal(err) 17 } 18 if err := RegisterFileReader(&SegReader{Type: TypeStage, Name: "Stage", New: NewStageRecord}); err != nil { 19 log.Fatal(err) 20 } 21 } 22 23 func NewLegacyStageRecord(f *File) (ReadWriter, error) { 24 r := &LegacyStageRecord{File: *f} 25 return r, nil 26 } 27 28 func (r *LegacyStageRecord) Read(in io.ReadSeeker) error { 29 if err := ReadLE(in, &r.StageHeader); err != nil { 30 Debug("StageHeader read: %v", err) 31 return err 32 } 33 Debug("Got StageHeader %s, data is %d bytes", r.String(), r.StageHeader.Size) 34 r.Data = make([]byte, r.StageHeader.Size) 35 n, err := in.Read(r.Data) 36 if err != nil { 37 return err 38 } 39 Debug("Stage read %d bytes", n) 40 return nil 41 } 42 43 type mStage struct { 44 Name string 45 Start uint32 46 Size uint32 47 Type string 48 Compression string 49 } 50 51 func (h *LegacyStageRecord) MarshalJSON() ([]byte, error) { 52 s := mStage{ 53 Name: h.File.Name, 54 Start: h.RecordStart, 55 Size: h.Size, 56 Type: h.Type.String(), 57 Compression: h.File.Compression().String(), 58 } 59 60 return json.Marshal(s) 61 } 62 63 func (h *StageHeader) String() string { 64 return fmt.Sprintf("Compression %#x Entry %#x LoadAddress %#x Size %#x MemSize %#x", 65 h.Compression, 66 h.Entry, 67 h.LoadAddress, 68 h.Size, 69 h.MemSize) 70 } 71 72 func (h *LegacyStageRecord) String() string { 73 return recString(h.File.Name, h.RecordStart, h.Type.String(), h.Size, h.File.Compression().String()) 74 } 75 76 func (r *LegacyStageRecord) Write(w io.Writer) error { 77 if err := WriteLE(w, r.StageHeader); err != nil { 78 return err 79 } 80 81 return Write(w, r.Data) 82 } 83 84 func (r *LegacyStageRecord) GetFile() *File { 85 return &r.File 86 } 87 88 func NewStageRecord(f *File) (ReadWriter, error) { 89 r := &StageRecord{File: *f} 90 return r, nil 91 } 92 93 func (r *StageRecord) Read(in io.ReadSeeker) error { 94 return nil 95 } 96 97 func (h *FileAttrStageHeader) String() string { 98 return fmt.Sprintf("Size %#x LoadAddress %#x EntryOffset %#x MemSize %#x", 99 h.Size, 100 h.LoadAddress, 101 h.EntryOffset, 102 h.MemSize) 103 } 104 105 func (h *StageRecord) String() string { 106 return recString(h.File.Name, h.RecordStart, h.Type.String(), h.File.Size, h.File.Compression().String()) 107 } 108 109 func (r *StageRecord) Write(w io.Writer) error { 110 return Write(w, r.Data) 111 } 112 113 func (r *StageRecord) GetFile() *File { 114 return &r.File 115 }