You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/11/05 01:57:19 UTC
incubator-mynewt-newt git commit: newt - Include meta section+offset
in mfg manifest
Repository: incubator-mynewt-newt
Updated Branches:
refs/heads/develop 9dbb073c4 -> 3bee26785
newt - Include meta section+offset in mfg manifest
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/commit/3bee2678
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/tree/3bee2678
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/diff/3bee2678
Branch: refs/heads/develop
Commit: 3bee26785ceb293e49b3126b70fe6a7b0608718e
Parents: 9dbb073
Author: Christopher Collins <cc...@apache.org>
Authored: Fri Nov 4 18:56:55 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Fri Nov 4 18:56:55 2016 -0700
----------------------------------------------------------------------
newt/mfg/create.go | 69 ++++++++++++++++++++++++++++++-------------------
newt/mfg/meta.go | 23 ++++++++++-------
2 files changed, 55 insertions(+), 37 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/3bee2678/newt/mfg/create.go
----------------------------------------------------------------------
diff --git a/newt/mfg/create.go b/newt/mfg/create.go
index fc11f75..7eaf982 100644
--- a/newt/mfg/create.go
+++ b/newt/mfg/create.go
@@ -36,8 +36,18 @@ import (
)
type mfgManifest struct {
- BuildTime string `json:"build_time"`
- MfgHash string `json:"mfg_hash"`
+ BuildTime string `json:"build_time"`
+ MfgHash string `json:"mfg_hash"`
+ MetaSection int `json:"meta_section"`
+ MetaOffset int `json:"meta_offset"`
+}
+
+type createState struct {
+ // {0:[section0blob], 1:[section1blob], ...}
+ dsMap map[int][]byte
+ metaOffset int
+ hashOffset int
+ hash []byte
}
func insertPartIntoBlob(blob []byte, part mfgPart) {
@@ -201,37 +211,41 @@ func (mi *MfgImage) deviceSectionMap() (map[int][]byte, error) {
return dsMap, nil
}
-// @return [section0blob, section1blob,...], hash, err
-func (mi *MfgImage) createSections() (map[int][]byte, []byte, error) {
- dsMap, err := mi.deviceSectionMap()
+func (mi *MfgImage) createSections() (createState, error) {
+ cs := createState{}
+
+ var err error
+
+ cs.dsMap, err = mi.deviceSectionMap()
if err != nil {
- return nil, nil, err
+ return cs, err
}
- if dsMap[0] == nil {
+ if cs.dsMap[0] == nil {
panic("Invalid state; no section 0")
}
- hashOffset, err := insertMeta(dsMap[0], mi.bsp.FlashMap)
+ cs.metaOffset, cs.hashOffset, err = insertMeta(cs.dsMap[0],
+ mi.bsp.FlashMap)
if err != nil {
- return nil, nil, err
+ return cs, err
}
// Calculate manufacturing hash.
- devices := make([]int, 0, len(dsMap))
- for device, _ := range dsMap {
+ devices := make([]int, 0, len(cs.dsMap))
+ for device, _ := range cs.dsMap {
devices = append(devices, device)
}
sort.Ints(devices)
sections := make([][]byte, len(devices))
for i, device := range devices {
- sections[i] = dsMap[device]
+ sections[i] = cs.dsMap[device]
}
- hash := calcMetaHash(sections)
- copy(dsMap[0][hashOffset:hashOffset+META_HASH_SZ], hash)
+ cs.hash = calcMetaHash(sections)
+ copy(cs.dsMap[0][cs.hashOffset:cs.hashOffset+META_HASH_SZ], cs.hash)
- return dsMap, hash, nil
+ return cs, nil
}
func areaNameFromImgIdx(imgIdx int) (string, error) {
@@ -403,24 +417,25 @@ func (mi *MfgImage) FromPaths() []string {
return paths
}
-// @return [section0blob, section1blob,...], hash, err
-func (mi *MfgImage) build() (map[int][]byte, []byte, error) {
+func (mi *MfgImage) build() (createState, error) {
if err := mi.copyBinFiles(); err != nil {
- return nil, nil, err
+ return createState{}, err
}
- sections, hash, err := mi.createSections()
+ cs, err := mi.createSections()
if err != nil {
- return nil, nil, err
+ return cs, err
}
- return sections, hash, nil
+ return cs, nil
}
-func (mi *MfgImage) createManifest(hash []byte) ([]byte, error) {
+func (mi *MfgImage) createManifest(cs createState) ([]byte, error) {
manifest := mfgManifest{
- BuildTime: time.Now().Format(time.RFC3339),
- MfgHash: fmt.Sprintf("%x", hash),
+ BuildTime: time.Now().Format(time.RFC3339),
+ MfgHash: fmt.Sprintf("%x", cs.hash),
+ MetaSection: 0,
+ MetaOffset: cs.metaOffset,
}
buffer, err := json.MarshalIndent(manifest, "", " ")
if err != nil {
@@ -462,7 +477,7 @@ func (mi *MfgImage) ToPaths() []string {
// @return [paths-of-artifacts], error
func (mi *MfgImage) CreateMfgImage() ([]string, error) {
- sections, hash, err := mi.build()
+ cs, err := mi.build()
if err != nil {
return nil, err
}
@@ -472,14 +487,14 @@ func (mi *MfgImage) CreateMfgImage() ([]string, error) {
return nil, util.ChildNewtError(err)
}
- for device, section := range sections {
+ for device, section := range cs.dsMap {
sectionPath := MfgSectionBinPath(mi.basePkg.Name(), device)
if err := ioutil.WriteFile(sectionPath, section, 0644); err != nil {
return nil, util.ChildNewtError(err)
}
}
- manifest, err := mi.createManifest(hash)
+ manifest, err := mi.createManifest(cs)
if err != nil {
return nil, err
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/3bee2678/newt/mfg/meta.go
----------------------------------------------------------------------
diff --git a/newt/mfg/meta.go b/newt/mfg/meta.go
index 796f08e..58c3684 100644
--- a/newt/mfg/meta.go
+++ b/newt/mfg/meta.go
@@ -129,37 +129,40 @@ func writeZeroHash(buf *bytes.Buffer) error {
return writeElem(tlv, buf)
}
-// @return Hash offset, error
-func insertMeta(section0Data []byte, flashMap flash.FlashMap) (int, error) {
+// @return meta-offset, hash-offset, error
+func insertMeta(section0Data []byte, flashMap flash.FlashMap) (
+ int, int, error) {
+
buf := &bytes.Buffer{}
if err := writeHeader(buf); err != nil {
- return 0, err
+ return 0, 0, err
}
for _, area := range flashMap.SortedAreas() {
if err := writeFlashArea(area, buf); err != nil {
- return 0, err
+ return 0, 0, err
}
}
if err := writeZeroHash(buf); err != nil {
- return 0, err
+ return 0, 0, err
}
hashSubOff := buf.Len() - META_HASH_SZ
if err := writeFooter(buf); err != nil {
- return 0, err
+ return 0, 0, err
}
// The meta region gets placed at the very end of the boot loader slot.
bootArea, ok := flashMap.Areas[flash.FLASH_AREA_NAME_BOOTLOADER]
if !ok {
- return 0, util.NewNewtError("Required boot loader flash area missing")
+ return 0, 0,
+ util.NewNewtError("Required boot loader flash area missing")
}
if bootArea.Size < buf.Len() {
- return 0, util.FmtNewtError(
+ return 0, 0, util.FmtNewtError(
"Boot loader flash area too small to accommodate meta region; "+
"boot=%d meta=%d", bootArea.Size, buf.Len())
}
@@ -167,7 +170,7 @@ func insertMeta(section0Data []byte, flashMap flash.FlashMap) (int, error) {
metaOff := bootArea.Offset + bootArea.Size - buf.Len()
for i := metaOff; i < bootArea.Size; i++ {
if section0Data[i] != 0xff {
- return 0, util.FmtNewtError(
+ return 0, 0, util.FmtNewtError(
"Boot loader extends into meta region; "+
"meta region starts at offset %d", metaOff)
}
@@ -177,7 +180,7 @@ func insertMeta(section0Data []byte, flashMap flash.FlashMap) (int, error) {
// still zeroed.
copy(section0Data[metaOff:], buf.Bytes())
- return metaOff + hashSubOff, nil
+ return metaOff, metaOff + hashSubOff, nil
}
func calcMetaHash(sections [][]byte) []byte {