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 {