Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/vm/img.c@0:14e5e829dffe, 2010-07-21 (annotated)
- Committer:
- dadaista
- Date:
- Wed Jul 21 12:50:41 2010 +0000
- Revision:
- 0:14e5e829dffe
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dadaista | 0:14e5e829dffe | 1 | /* |
dadaista | 0:14e5e829dffe | 2 | # This file is Copyright 2003, 2006, 2007, 2009 Dean Hall. |
dadaista | 0:14e5e829dffe | 3 | # |
dadaista | 0:14e5e829dffe | 4 | # This file is part of the PyMite VM. |
dadaista | 0:14e5e829dffe | 5 | # The PyMite VM is free software: you can redistribute it and/or modify |
dadaista | 0:14e5e829dffe | 6 | # it under the terms of the GNU GENERAL PUBLIC LICENSE Version 2. |
dadaista | 0:14e5e829dffe | 7 | # |
dadaista | 0:14e5e829dffe | 8 | # The PyMite VM is distributed in the hope that it will be useful, |
dadaista | 0:14e5e829dffe | 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
dadaista | 0:14e5e829dffe | 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
dadaista | 0:14e5e829dffe | 11 | # A copy of the GNU GENERAL PUBLIC LICENSE Version 2 |
dadaista | 0:14e5e829dffe | 12 | # is seen in the file COPYING in this directory. |
dadaista | 0:14e5e829dffe | 13 | */ |
dadaista | 0:14e5e829dffe | 14 | |
dadaista | 0:14e5e829dffe | 15 | |
dadaista | 0:14e5e829dffe | 16 | #undef __FILE_ID__ |
dadaista | 0:14e5e829dffe | 17 | #define __FILE_ID__ 0x07 |
dadaista | 0:14e5e829dffe | 18 | |
dadaista | 0:14e5e829dffe | 19 | |
dadaista | 0:14e5e829dffe | 20 | /** |
dadaista | 0:14e5e829dffe | 21 | * \file |
dadaista | 0:14e5e829dffe | 22 | * \brief Image routines |
dadaista | 0:14e5e829dffe | 23 | * |
dadaista | 0:14e5e829dffe | 24 | * Created to eliminate a circular include |
dadaista | 0:14e5e829dffe | 25 | * among mem, string and obj. |
dadaista | 0:14e5e829dffe | 26 | */ |
dadaista | 0:14e5e829dffe | 27 | |
dadaista | 0:14e5e829dffe | 28 | |
dadaista | 0:14e5e829dffe | 29 | #include "pm.h" |
dadaista | 0:14e5e829dffe | 30 | |
dadaista | 0:14e5e829dffe | 31 | |
dadaista | 0:14e5e829dffe | 32 | /* |
dadaista | 0:14e5e829dffe | 33 | * Searches for a module's name in a contiguous array of images |
dadaista | 0:14e5e829dffe | 34 | * in the given namespace starting at the given address. |
dadaista | 0:14e5e829dffe | 35 | * A module's name is stored in the last index of the names tuple of an image. |
dadaista | 0:14e5e829dffe | 36 | */ |
dadaista | 0:14e5e829dffe | 37 | static PmReturn_t |
dadaista | 0:14e5e829dffe | 38 | img_findInPath(uint8_t *cname, uint8_t cnamelen, PmMemSpace_t memspace, |
dadaista | 0:14e5e829dffe | 39 | uint8_t const **paddr) |
dadaista | 0:14e5e829dffe | 40 | { |
dadaista | 0:14e5e829dffe | 41 | uint8_t const *imgtop; |
dadaista | 0:14e5e829dffe | 42 | PmType_t type; |
dadaista | 0:14e5e829dffe | 43 | uint16_t len; |
dadaista | 0:14e5e829dffe | 44 | int16_t size = 0; |
dadaista | 0:14e5e829dffe | 45 | uint8_t i = 0; |
dadaista | 0:14e5e829dffe | 46 | |
dadaista | 0:14e5e829dffe | 47 | /* Addr is top of img */ |
dadaista | 0:14e5e829dffe | 48 | imgtop = *paddr; |
dadaista | 0:14e5e829dffe | 49 | |
dadaista | 0:14e5e829dffe | 50 | /* Get img's type byte */ |
dadaista | 0:14e5e829dffe | 51 | type = (PmType_t)mem_getByte(memspace, paddr); |
dadaista | 0:14e5e829dffe | 52 | |
dadaista | 0:14e5e829dffe | 53 | /* Search all sequential images */ |
dadaista | 0:14e5e829dffe | 54 | while (type == OBJ_TYPE_CIM) |
dadaista | 0:14e5e829dffe | 55 | { |
dadaista | 0:14e5e829dffe | 56 | /* Use size field to calc addr of next potential img */ |
dadaista | 0:14e5e829dffe | 57 | size = mem_getWord(memspace, paddr); |
dadaista | 0:14e5e829dffe | 58 | |
dadaista | 0:14e5e829dffe | 59 | /* Point to names tuple */ |
dadaista | 0:14e5e829dffe | 60 | *paddr = imgtop + CI_NAMES_FIELD; |
dadaista | 0:14e5e829dffe | 61 | |
dadaista | 0:14e5e829dffe | 62 | /* Ensure it's a tuple */ |
dadaista | 0:14e5e829dffe | 63 | type = (PmType_t)mem_getByte(memspace, paddr); |
dadaista | 0:14e5e829dffe | 64 | C_ASSERT(type == OBJ_TYPE_TUP); |
dadaista | 0:14e5e829dffe | 65 | |
dadaista | 0:14e5e829dffe | 66 | /* Scan to last name in tuple (it's the module's name) */ |
dadaista | 0:14e5e829dffe | 67 | i = mem_getByte(memspace, paddr) - (uint8_t)1; |
dadaista | 0:14e5e829dffe | 68 | for (; i > 0; i--) |
dadaista | 0:14e5e829dffe | 69 | { |
dadaista | 0:14e5e829dffe | 70 | /* Ensure obj is a string */ |
dadaista | 0:14e5e829dffe | 71 | type = (PmType_t)mem_getByte(memspace, paddr); |
dadaista | 0:14e5e829dffe | 72 | C_ASSERT(type == OBJ_TYPE_STR); |
dadaista | 0:14e5e829dffe | 73 | |
dadaista | 0:14e5e829dffe | 74 | /* Skip the length of the string */ |
dadaista | 0:14e5e829dffe | 75 | len = mem_getWord(memspace, paddr); |
dadaista | 0:14e5e829dffe | 76 | (*paddr) += len; |
dadaista | 0:14e5e829dffe | 77 | } |
dadaista | 0:14e5e829dffe | 78 | |
dadaista | 0:14e5e829dffe | 79 | /* Ensure it's a string */ |
dadaista | 0:14e5e829dffe | 80 | type = (PmType_t)mem_getByte(memspace, paddr); |
dadaista | 0:14e5e829dffe | 81 | C_ASSERT(type == OBJ_TYPE_STR); |
dadaista | 0:14e5e829dffe | 82 | |
dadaista | 0:14e5e829dffe | 83 | /* If strings match, return the address of this image */ |
dadaista | 0:14e5e829dffe | 84 | if ((cnamelen == mem_getWord(memspace, paddr)) |
dadaista | 0:14e5e829dffe | 85 | && (PM_RET_OK == mem_cmpn(cname, cnamelen, memspace, paddr))) |
dadaista | 0:14e5e829dffe | 86 | { |
dadaista | 0:14e5e829dffe | 87 | *paddr = imgtop; |
dadaista | 0:14e5e829dffe | 88 | return PM_RET_OK; |
dadaista | 0:14e5e829dffe | 89 | } |
dadaista | 0:14e5e829dffe | 90 | |
dadaista | 0:14e5e829dffe | 91 | /* Calc imgtop for next iteration */ |
dadaista | 0:14e5e829dffe | 92 | imgtop += size; |
dadaista | 0:14e5e829dffe | 93 | |
dadaista | 0:14e5e829dffe | 94 | /* Point to next potential img */ |
dadaista | 0:14e5e829dffe | 95 | *paddr = imgtop; |
dadaista | 0:14e5e829dffe | 96 | |
dadaista | 0:14e5e829dffe | 97 | /* Check if another img follows this one */ |
dadaista | 0:14e5e829dffe | 98 | type = (PmType_t)mem_getByte(memspace, paddr); |
dadaista | 0:14e5e829dffe | 99 | } |
dadaista | 0:14e5e829dffe | 100 | return PM_RET_NO; |
dadaista | 0:14e5e829dffe | 101 | } |
dadaista | 0:14e5e829dffe | 102 | |
dadaista | 0:14e5e829dffe | 103 | |
dadaista | 0:14e5e829dffe | 104 | PmReturn_t |
dadaista | 0:14e5e829dffe | 105 | img_findInPaths(pPmObj_t pname, PmMemSpace_t *r_memspace, |
dadaista | 0:14e5e829dffe | 106 | uint8_t const **r_imgaddr) |
dadaista | 0:14e5e829dffe | 107 | { |
dadaista | 0:14e5e829dffe | 108 | uint8_t i; |
dadaista | 0:14e5e829dffe | 109 | PmReturn_t retval = PM_RET_NO; |
dadaista | 0:14e5e829dffe | 110 | |
dadaista | 0:14e5e829dffe | 111 | /* Search in each path in the paths */ |
dadaista | 0:14e5e829dffe | 112 | for (i = 0; i < gVmGlobal.imgPaths.pathcount; i++) |
dadaista | 0:14e5e829dffe | 113 | { |
dadaista | 0:14e5e829dffe | 114 | *r_imgaddr = gVmGlobal.imgPaths.pimg[i]; |
dadaista | 0:14e5e829dffe | 115 | *r_memspace = gVmGlobal.imgPaths.memspace[i]; |
dadaista | 0:14e5e829dffe | 116 | retval = img_findInPath(((pPmString_t)pname)->val, |
dadaista | 0:14e5e829dffe | 117 | ((pPmString_t)pname)->length, |
dadaista | 0:14e5e829dffe | 118 | *r_memspace, r_imgaddr); |
dadaista | 0:14e5e829dffe | 119 | if (retval == PM_RET_NO) |
dadaista | 0:14e5e829dffe | 120 | { |
dadaista | 0:14e5e829dffe | 121 | continue; |
dadaista | 0:14e5e829dffe | 122 | } |
dadaista | 0:14e5e829dffe | 123 | else if (retval == PM_RET_OK) |
dadaista | 0:14e5e829dffe | 124 | { |
dadaista | 0:14e5e829dffe | 125 | break; |
dadaista | 0:14e5e829dffe | 126 | } |
dadaista | 0:14e5e829dffe | 127 | else |
dadaista | 0:14e5e829dffe | 128 | { |
dadaista | 0:14e5e829dffe | 129 | return retval; |
dadaista | 0:14e5e829dffe | 130 | } |
dadaista | 0:14e5e829dffe | 131 | } |
dadaista | 0:14e5e829dffe | 132 | |
dadaista | 0:14e5e829dffe | 133 | return retval; |
dadaista | 0:14e5e829dffe | 134 | } |
dadaista | 0:14e5e829dffe | 135 | |
dadaista | 0:14e5e829dffe | 136 | |
dadaista | 0:14e5e829dffe | 137 | PmReturn_t |
dadaista | 0:14e5e829dffe | 138 | img_appendToPath(PmMemSpace_t memspace, uint8_t *paddr) |
dadaista | 0:14e5e829dffe | 139 | { |
dadaista | 0:14e5e829dffe | 140 | uint8_t i; |
dadaista | 0:14e5e829dffe | 141 | |
dadaista | 0:14e5e829dffe | 142 | if (gVmGlobal.imgPaths.pathcount >= PM_NUM_IMG_PATHS) |
dadaista | 0:14e5e829dffe | 143 | { |
dadaista | 0:14e5e829dffe | 144 | return PM_RET_NO; |
dadaista | 0:14e5e829dffe | 145 | } |
dadaista | 0:14e5e829dffe | 146 | |
dadaista | 0:14e5e829dffe | 147 | i = gVmGlobal.imgPaths.pathcount; |
dadaista | 0:14e5e829dffe | 148 | |
dadaista | 0:14e5e829dffe | 149 | gVmGlobal.imgPaths.memspace[i] = memspace; |
dadaista | 0:14e5e829dffe | 150 | gVmGlobal.imgPaths.pimg[i] = paddr; |
dadaista | 0:14e5e829dffe | 151 | gVmGlobal.imgPaths.pathcount++; |
dadaista | 0:14e5e829dffe | 152 | |
dadaista | 0:14e5e829dffe | 153 | return PM_RET_OK; |
dadaista | 0:14e5e829dffe | 154 | } |