Changeset 8f6c7785 in mainline
- Timestamp:
- 2013-04-26T02:55:32Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 700f89e
- Parents:
- d617050
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
tools/toolchain.sh
rd617050 r8f6c7785 56 56 BINUTILS_RELEASE="" 57 57 #GCC_VERSION="4.7.2" 58 GCC_VERSION="4.8.0" 58 GCC_VERSION="4.7.3" 59 #GCC_VERSION="4.8.0" 59 60 GDB_VERSION="7.5" 60 61 … … 72 73 HEADER="$2" 73 74 BODY="$3" 74 75 75 76 FNAME="/tmp/conftest-$$" 76 77 77 78 echo "#include ${HEADER}" > "${FNAME}.c" 78 79 echo >> "${FNAME}.c" … … 82 83 echo " return 0;" >> "${FNAME}.c" 83 84 echo "}" >> "${FNAME}.c" 84 85 85 86 cc -c -o "${FNAME}.o" "${FNAME}.c" 2> "${FNAME}.log" 86 87 RC="$?" 87 88 88 89 if [ "$RC" -ne "0" ] ; then 89 90 echo " ${DEPENDENCY} not found, too old or compiler error." … … 114 115 echo 115 116 echo "Script failed: $2" 116 117 117 118 exit 1 118 119 fi … … 122 123 FILE="$1" 123 124 SUM="$2" 124 125 125 126 COMPUTED="`md5sum "${FILE}" | cut -d' ' -f1`" 126 127 if [ "${SUM}" != "${COMPUTED}" ] ; then 127 128 echo 128 129 echo "Checksum of ${FILE} does not match." 129 130 130 131 exit 2 131 132 fi … … 157 158 echo "defined, /usr/local/cross will be used by default." 158 159 echo 159 160 160 161 exit 3 161 162 } … … 167 168 show_countdown() { 168 169 TM="$1" 169 170 170 171 if [ "${TM}" -eq 0 ] ; then 171 172 echo 172 173 return 0 173 174 fi 174 175 175 176 echo -n "${TM} " 176 177 change_title "${TM}" 177 178 sleep 1 178 179 179 180 TM="`expr "${TM}" - 1`" 180 181 show_countdown "${TM}" … … 212 213 FILE="$2" 213 214 CHECKSUM="$3" 214 215 215 216 if [ ! -f "${FILE}" ]; then 216 217 change_title "Downloading ${FILE}" … … 218 219 check_error $? "Error downloading ${FILE}." 219 220 fi 220 221 221 222 check_md5 "${FILE}" "${CHECKSUM}" 222 223 } … … 224 225 source_check() { 225 226 FILE="$1" 226 227 227 228 if [ ! -f "${FILE}" ]; then 228 229 echo 229 230 echo "File ${FILE} not found." 230 231 231 232 exit 4 232 233 fi … … 235 236 cleanup_dir() { 236 237 DIR="$1" 237 238 238 239 if [ -d "${DIR}" ]; then 239 240 change_title "Removing ${DIR}" … … 246 247 DIR="$1" 247 248 DESC="$2" 248 249 249 250 change_title "Creating ${DESC}" 250 251 echo ">>> Creating ${DESC}" 251 252 252 253 mkdir -p "${DIR}" 253 254 test -d "${DIR}" … … 258 259 FILE="$1" 259 260 DESC="$2" 260 261 261 262 change_title "Unpacking ${DESC}" 262 263 echo " >>> Unpacking ${DESC}" 263 264 264 265 tar -xjf "${FILE}" 265 266 check_error $? "Error unpacking ${DESC}." … … 270 271 check_dependecies 271 272 show_countdown 10 272 273 273 274 BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" 274 275 GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" 275 276 GDB_SOURCE="ftp://ftp.gnu.org/gnu/gdb/" 276 277 277 278 download_fetch "${BINUTILS_SOURCE}" "${BINUTILS}" "ee0f10756c84979622b992a4a61ea3f5" 278 279 download_fetch "${GCC_SOURCE}" "${GCC}" "cc308a0891e778cfda7a151ab8a6e762" … … 283 284 PLATFORM="$1" 284 285 TARGET="$2" 285 286 286 287 WORKDIR="${BASEDIR}/${PLATFORM}" 287 288 BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" … … 289 290 OBJDIR="${WORKDIR}/gcc-obj" 290 291 GDBDIR="${WORKDIR}/gdb-${GDB_VERSION}" 291 292 292 293 if [ -z "${CROSS_PREFIX}" ] ; then 293 294 CROSS_PREFIX="/usr/local/cross" 294 295 fi 295 296 296 297 PREFIX="${CROSS_PREFIX}/${PLATFORM}" 297 298 298 299 echo ">>> Downloading tarballs" 299 300 #source_check "${BASEDIR}/${BINUTILS}" 300 301 source_check "${BASEDIR}/${GCC}" 301 302 #source_check "${BASEDIR}/${GDB}" 302 303 303 304 echo ">>> Removing previous content" 304 305 #cleanup_dir "${PREFIX}" 305 306 #cleanup_dir "${WORKDIR}" 306 307 307 308 create_dir "${PREFIX}" "destination directory" 308 309 create_dir "${OBJDIR}" "GCC object directory" 309 310 310 311 echo ">>> Unpacking tarballs" 311 312 cd "${WORKDIR}" 312 313 check_error $? "Change directory failed." 313 314 unpack_tarball "${BASEDIR}/${BINUTILS}" "binutils" 315 #unpack_tarball "${BASEDIR}/${GCC}" "GCC" 316 unpack_tarball "${BASEDIR}/${GDB}" "GDB" 317 318 echo ">>> Processing binutils (${PLATFORM})" 319 cd "${BINUTILSDIR}" 314 315 #unpack_tarball "${BASEDIR}/${BINUTILS}" "binutils" 316 unpack_tarball "${BASEDIR}/${GCC}" "GCC" 317 #unpack_tarball "${BASEDIR}/${GDB}" "GDB" 318 319 #echo ">>> Processing binutils (${PLATFORM})" 320 #cd "${BINUTILSDIR}" 321 #check_error $? "Change directory failed." 322 323 #change_title "binutils: configure (${PLATFORM})" 324 #CFLAGS=-Wno-error ./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --disable-nls --disable-werror 325 #check_error $? "Error configuring binutils." 326 327 #change_title "binutils: make (${PLATFORM})" 328 #make all install 329 #check_error $? "Error compiling/installing binutils." 330 331 echo ">>> Processing GCC (${PLATFORM})" 332 cd "${OBJDIR}" 320 333 check_error $? "Change directory failed." 321 322 change_title " binutils: configure (${PLATFORM})"323 CFLAGS=-Wno-error ./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --disable-nls--disable-werror324 check_error $? "Error configuring binutils."325 326 change_title " binutils: make (${PLATFORM})"327 make all install328 check_error $? "Error compiling/installing binutils."329 330 echo ">>> Processing GCC(${PLATFORM})"331 #cd "${ OBJDIR}"334 335 change_title "GCC: configure (${PLATFORM})" 336 "${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared --enable-lto --disable-werror 337 check_error $? "Error configuring GCC." 338 339 change_title "GCC: make (${PLATFORM})" 340 PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc 341 check_error $? "Error compiling/installing GCC." 342 343 #echo ">>> Processing GDB (${PLATFORM})" 344 #cd "${GDBDIR}" 332 345 #check_error $? "Change directory failed." 333 334 change_title "GCC: configure (${PLATFORM})" 335 #"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared --enable-lto --disable-werror 336 #check_error $? "Error configuring GCC." 337 338 change_title "GCC: make (${PLATFORM})" 339 #PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc 340 #check_error $? "Error compiling/installing GCC." 341 342 echo ">>> Processing GDB (${PLATFORM})" 343 cd "${GDBDIR}" 344 check_error $? "Change directory failed." 345 346 change_title "GDB: configure (${PLATFORM})" 347 ./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" 348 check_error $? "Error configuring GDB." 349 350 change_title "GDB: make (${PLATFORM})" 351 make all install 352 check_error $? "Error compiling/installing GDB." 353 346 347 #change_title "GDB: configure (${PLATFORM})" 348 #./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" 349 #check_error $? "Error configuring GDB." 350 351 #change_title "GDB: make (${PLATFORM})" 352 #make all install 353 #check_error $? "Error compiling/installing GDB." 354 354 355 cd "${BASEDIR}" 355 356 check_error $? "Change directory failed." 356 357 357 358 echo ">>> Cleaning up" 358 359 cleanup_dir "${WORKDIR}" 359 360 360 361 echo 361 362 echo ">>> Cross-compiler for ${TARGET} installed." … … 439 440 build_target "arm32" "arm-linux-gnueabi" & 440 441 wait 441 442 442 443 build_target "ia32" "i686-pc-linux-gnu" & 443 444 build_target "ia64" "ia64-pc-linux-gnu" & 444 445 wait 445 446 446 447 build_target "mips32" "mipsel-linux-gnu" & 447 448 build_target "mips32eb" "mips-linux-gnu" & 448 449 wait 449 450 450 451 build_target "mips64" "mips64el-linux-gnu" & 451 452 build_target "ppc32" "ppc-linux-gnu" & 452 453 wait 453 454 454 455 build_target "ppc64" "ppc64-linux-gnu" & 455 456 build_target "sparc64" "sparc64-linux-gnu" & -
uspace/app/hdisk/func_gpt.c
rd617050 r8f6c7785 49 49 return ENOMEM; 50 50 } 51 51 52 52 return set_gpt_partition(in, p); 53 53 } … … 59 59 printf("Number of the partition to delete (counted from 0): "); 60 60 idx = get_input_size_t(in); 61 61 62 62 if (gpt_remove_partition(data->gpt.parts, idx) == -1) { 63 63 printf("Warning: running low on memory, not resizing...\n"); 64 64 } 65 65 66 66 return EOK; 67 67 } … … 69 69 int print_gpt_parts(union table_data * data) 70 70 { 71 //int rc; 71 72 printf("Current partition scheme (GPT):\n"); 72 73 printf("\t\tStart:\tEnd:\tLength:\tType:\tName:\n"); 73 74 74 gpt_foreach(data->gpt.parts, i, iter) { 75 printf("\t%10u %10u %10u %3d\n", iter->start_addr, iter->start_addr + iter->length, 76 iter->length, gpt_get_part_type(iter), gpt_get_part_name(iter)); 75 size_t i = 0; 76 77 gpt_part_foreach(data->gpt.parts, iter) { 78 //printf("\t%10u %10u %10u %3d\n", iter->start_addr, iter->start_addr + iter->length, 79 // iter->length, gpt_get_part_type(iter), gpt_get_part_name(iter)); 80 printf("%3u\t%10llu %10llu %10llu %3d %s\n", i, gpt_get_start_lba(iter), gpt_get_end_lba(iter), 81 gpt_get_end_lba(iter) - gpt_get_start_lba(iter), gpt_get_part_type(iter), 82 gpt_get_part_name(iter)); 83 i++; 77 84 } 78 79 return rc; 85 86 //return rc; 87 return EOK; 80 88 } 81 89 … … 83 91 { 84 92 int rc; 85 93 86 94 rc = gpt_write_partitions(data->gpt.parts, data->gpt.gpt, dev_handle); 87 95 if (rc != EOK) { … … 89 97 return rc; 90 98 } 91 99 92 100 rc = gpt_write_gpt_header(data->gpt.gpt, dev_handle); 93 101 if (rc != EOK) { … … 95 103 return rc; 96 104 } 97 105 98 106 return EOK; 99 107 } … … 106 114 static int set_gpt_partition(tinput_t * in, gpt_part_t * p) 107 115 { 108 int rc;109 116 //int rc; 117 110 118 uint64_t sa, ea; 111 119 112 120 printf("Set starting address (number): "); 113 121 sa = get_input_uint64(in); … … 115 123 printf("Set end addres (number): "); 116 124 ea = get_input_uint64(in); 117 125 118 126 if (ea <= sa) { 119 127 printf("Invalid value.\n"); 120 128 return EINVAL; 121 129 } 122 123 124 p->start_addr = sa; 125 p->length = ea - sa; 126 130 131 132 //p->start_addr = sa; 133 gpt_set_start_lba(p, sa); 134 //p->length = ea - sa; 135 gpt_set_end_lba(p, ea); 136 127 137 return EOK; 128 138 } -
uspace/app/hdisk/func_mbr.c
rd617050 r8f6c7785 83 83 84 84 printf("Current partition scheme:\n"); 85 printf("\t\tBootable:\tStart:\tEnd:\tLength:\tType:\n"); 86 85 //printf("\t\tBootable:\tStart:\tEnd:\tLength:\tType:\n"); 86 printf("\t\t%10s %10s %10s %10s %7s\n", "Bootable:", "Start:", "End:", "Length:", "Type:"); 87 88 mbr_part_t * it; 87 89 mbr_part_foreach(data->mbr.parts, it) { 88 90 if (it->type == PT_UNUSED) 89 91 continue; 90 92 91 printf("\t 93 printf("\tP%d:\t", num); 92 94 if (mbr_get_flag(it, ST_BOOT)) 93 95 printf("*"); … … 95 97 printf(" "); 96 98 97 printf("\t%10u %10u %10u % 3d\n", it->start_addr, it->start_addr + it->length, it->length, it->type);99 printf("\t%10u %10u %10u %7x\n", it->start_addr, it->start_addr + it->length, it->length, it->type); 98 100 99 101 ++num; … … 101 103 102 104 printf("%d partitions found.\n", num); 105 printf("DEBUG: primary: %hhu, logical: %u\n", data->mbr.parts->n_primary, data->mbr.parts->n_logical); 103 106 104 107 return EOK; -
uspace/app/hdisk/hdisk.c
rd617050 r8f6c7785 73 73 return -1; 74 74 } 75 75 76 76 init_table(); 77 77 78 78 mbr_t * mbr = mbr_read_mbr(dev_handle); 79 79 if(mbr == NULL) { … … 98 98 mbr_free_mbr(mbr); 99 99 gpt_t * gpt = gpt_read_gpt_header(dev_handle); 100 printf("here3\n"); 100 101 if(gpt == NULL) { 101 102 printf("Failed to read and parse GPT header. Exiting.\n"); … … 103 104 } 104 105 set_table_gpt(gpt); 106 printf("here4\n"); 105 107 gpt_partitions_t * parts = gpt_read_partitions(gpt); 108 printf("here5\n"); 106 109 if(parts == NULL) { 107 110 printf("Failed to read and parse partitions.\n" \ … … 114 117 115 118 rc = interact(dev_handle); 116 119 117 120 free_table(); 118 121 119 122 return rc; 120 123 } … … 188 191 input = getchar(); 189 192 printf("%c\n", input); 190 193 191 194 192 195 //rc = tinput_read(in, &str); -
uspace/lib/gpt/libgpt.c
rd617050 r8f6c7785 67 67 int rc; 68 68 size_t b_size; 69 69 70 rc = block_init(EXCHANGE_ATOMIC, dev_handle, 512); 71 if (rc != EOK) 72 return NULL; 73 70 74 rc = block_get_bsize(dev_handle, &b_size); 71 75 if (rc != EOK) { … … 73 77 return NULL; 74 78 } 75 79 76 80 gpt_t * gpt = malloc(sizeof(gpt_t)); 77 81 if (gpt == NULL) { … … 80 84 } 81 85 82 gpt->raw_data = malloc(b_size); // We might need only sizeof(gpt_header_t),86 gpt->raw_data = malloc(b_size); // We might need only sizeof(gpt_header_t), 83 87 if (gpt == NULL) { // but we should follow specs and have 84 88 free(gpt); // zeroes through all the rest of the block … … 86 90 return NULL; 87 91 } 88 89 92 93 90 94 rc = load_and_check_header(dev_handle, GPT_HDR_BA, b_size, gpt->raw_data); 91 95 if (rc == EBADCHECKSUM || rc == EINVAL) { … … 103 107 } 104 108 } 105 109 106 110 gpt->device = dev_handle; 107 111 block_fini(dev_handle); 108 112 return gpt; 109 113 110 114 fail: 115 block_fini(dev_handle); 111 116 gpt_free_gpt(gpt); 112 117 return NULL; … … 130 135 uint32_t_le2host(gpt->raw_data->header_size)); 131 136 137 rc = block_init(EXCHANGE_ATOMIC, dev_handle, b_size); 138 if (rc != EOK) 139 return rc; 140 132 141 rc = block_get_bsize(dev_handle, &b_size); 133 if (rc != EOK)134 return rc;135 136 rc = block_init(EXCHANGE_ATOMIC, dev_handle, b_size);137 142 if (rc != EOK) 138 143 return rc; … … 252 257 gpt->raw_data->pe_array_crc32 = compute_crc32((uint8_t *) parts->part_array, parts->fill * gpt->raw_data->entry_size); 253 258 259 rc = block_init(EXCHANGE_ATOMIC, dev_handle, b_size); 260 if (rc != EOK) 261 return rc; 262 254 263 rc = block_get_bsize(dev_handle, &b_size); 255 if (rc != EOK)256 return rc;257 258 rc = block_init(EXCHANGE_ATOMIC, dev_handle, b_size);259 264 if (rc != EOK) 260 265 return rc; … … 473 478 int rc; 474 479 475 rc = block_init(EXCHANGE_ATOMIC, dev_handle, b_size);476 if (rc != EOK)477 return rc;478 479 480 rc = block_read_direct(dev_handle, addr, GPT_HDR_BS, header); 480 block_fini(dev_handle); 481 if (rc != EOK) 482 return rc; 483 481 if (rc != EOK) 482 return rc; 484 483 485 484 unsigned int i; -
uspace/lib/gpt/libgpt.h
rd617050 r8f6c7785 153 153 extern void gpt_set_start_lba (gpt_part_t * p, uint64_t start); 154 154 extern uint64_t gpt_get_start_lba (gpt_part_t * p); 155 extern void gpt_set_end_lba (gpt_part_t * p, uint64_t start);155 extern void gpt_set_end_lba (gpt_part_t * p, uint64_t end); 156 156 extern uint64_t gpt_get_end_lba (gpt_part_t * p); 157 157 extern unsigned char * gpt_get_part_name (gpt_part_t * p); … … 162 162 163 163 164 #define gpt_ foreach(parts, i, iterator) \165 for( size_t i = 0, gpt_part_t * iterator = parts->part_array; \166 i < parts->fill; i++, iterator++)164 #define gpt_part_foreach(parts, iterator) \ 165 for(gpt_part_t * iterator = (parts)->part_array; \ 166 iterator < (parts)->part_array + (parts)->fill; ++iterator) 167 167 168 168 extern void gpt_free_gpt(gpt_t * gpt); -
uspace/lib/mbr/libmbr.c
rd617050 r8f6c7785 33 33 */ 34 34 35 #include <async.h> 36 #include <assert.h> 37 #include <block.h> 38 #include <byteorder.h> 39 #include <errno.h> 35 40 #include <ipc/bd.h> 36 #include < async.h>41 #include <mem.h> 37 42 #include <stdio.h> 38 #include <block.h>39 #include <errno.h>40 43 #include <stdlib.h> 41 #include <assert.h>42 #include <byteorder.h>43 44 44 45 #include "libmbr.h" … … 47 48 static int decode_part(pt_entry_t * src, mbr_part_t * trgt, uint32_t base); 48 49 static int decode_logical(mbr_t * mbr, mbr_partitions_t * p, mbr_part_t * ext); 49 static void encode_part(mbr_part_t * src, pt_entry_t * trgt, uint32_t base );50 static void encode_part(mbr_part_t * src, pt_entry_t * trgt, uint32_t base, bool ebr); 50 51 static int check_overlap(mbr_part_t * p1, mbr_part_t * p2); 51 52 static int check_encaps(mbr_part_t * inner, mbr_part_t * outer); 52 53 static int check_preceeds(mbr_part_t * preceeder, mbr_part_t * precedee); 54 55 static void debug_print(unsigned char * data, size_t bytes); 53 56 54 57 /** Read MBR from specific device … … 128 131 mbr_partitions_t * mbr_read_partitions(mbr_t * mbr) 129 132 { 130 int rc, i ;133 int rc, i, rc_ext; 131 134 mbr_part_t * p; 132 135 mbr_part_t * ext = NULL; 133 136 mbr_partitions_t * parts; 134 137 135 138 if (mbr == NULL) 136 139 return NULL; 137 140 138 141 parts = mbr_alloc_partitions(); 139 142 if (parts == NULL) { … … 145 148 if (mbr->raw_data.pte[i].ptype == PT_UNUSED) 146 149 continue; 147 148 p = malloc(sizeof(mbr_part_t)); 150 151 //p = malloc(sizeof(mbr_part_t)); 152 p = mbr_alloc_partition(); 149 153 if (p == NULL) { 150 154 printf(LIBMBR_NAME ": Error on memory allocation.\n"); 151 free(p);152 155 mbr_free_partitions(parts); 153 156 return NULL; 154 157 } 155 158 //list_append(&(p->link), &(parts->list)); 156 p->ebr = NULL; 157 if (decode_part(&(mbr->raw_data.pte[i]), p, 0)) { 159 rc_ext = decode_part(&(mbr->raw_data.pte[i]), p, 0); 160 mbr_set_flag(p, ST_LOGIC, false); 161 rc = mbr_add_partition(parts, p); 162 if (rc != ERR_OK) { 163 printf(LIBMBR_NAME ": Error occured during decoding the MBR. (%d)\n" \ 164 LIBMBR_NAME ": Partition list may be incomplete.\n", rc); 165 return NULL; 166 } 167 168 if (rc_ext) { 158 169 ext = p; 159 170 parts->l_extended = list_last(&(parts->list)); 160 171 } 161 mbr_set_flag(p, ST_LOGIC, false); 162 mbr_add_partition(parts, p); 163 } 164 172 } 173 165 174 // Fill in the primary partitions and generate logical ones, if any 166 175 rc = decode_logical(mbr, parts, ext); … … 169 178 LIBMBR_NAME ": Partition list may be incomplete.\n"); 170 179 } 171 180 181 //DEBUG: 182 //debug_print((unsigned char *) list_get_instance(list_last(&(parts->list)), mbr_part_t, link)->ebr, 512); 172 183 return parts; 173 184 } … … 188 199 mbr_part_t * ext = (parts->l_extended == NULL) ? NULL 189 200 : list_get_instance(parts->l_extended, mbr_part_t, link); 190 201 191 202 //br_block_t * last_ebr = NULL; 192 203 //link_t * it; 193 204 194 205 DEBUG_PRINT_3(LIBMBR_NAME "Writing partitions: n_primary: %u, n_logical:%u, l_extended:%p", parts->n_primary, parts->n_logical, parts->l_extended); 195 206 196 207 rc = block_init(EXCHANGE_ATOMIC, dev_handle, 512); 197 208 if (rc != EOK) { … … 228 239 229 240 }*/ 230 241 231 242 link_t * l = parts->list.head.next; 232 243 233 244 // Encoding primary partitions 234 245 for (i = 0; i < parts->n_primary; i++) { 235 246 p = list_get_instance(l, mbr_part_t, link); 236 encode_part(p, &(mbr->raw_data.pte[i]), 0 );247 encode_part(p, &(mbr->raw_data.pte[i]), 0, false); 237 248 l = l->next; 238 249 } 239 250 240 251 // Writing MBR 241 252 rc = block_write_direct(dev_handle, 0, 1, &(mbr->raw_data)); … … 244 255 goto end; 245 256 } 246 257 247 258 if (ext == NULL) 248 259 goto no_extended; 249 250 260 261 //DEBUG: 262 //debug_print((unsigned char *) list_get_instance(list_last(&(parts->list)), mbr_part_t, link)->ebr, 512); 251 263 uint32_t base = ext->start_addr; 252 uint32_t addr = base; 253 264 //uint32_t addr = base; 265 //uint32_t prev_addr; 266 //mbr_part_t * tmp; 267 mbr_part_t * prev_p; 254 268 // Encoding and writing first logical partition 255 269 if (l != &(parts->list.head)) { 256 270 p = list_get_instance(l, mbr_part_t, link); 257 if (p->ebr == NULL) { 258 p->ebr = alloc_br(); 259 if (p->ebr == NULL) { 260 rc = ENOMEM; 261 goto end; 262 } 263 } 264 265 encode_part(p, &(p->ebr->pte[0]), base); 266 267 if (l->next == &(parts->list.head)) 268 encode_part(NULL, &(p->ebr->pte[1]), base); 269 else 270 encode_part(list_get_instance(l->next, mbr_part_t, link), &(p->ebr->pte[1]), base); 271 272 271 p->ebr_addr = base; 272 encode_part(p, &(p->ebr->pte[0]), base, false); 273 274 /*if (l->next == &(parts->list.head)) 275 encode_part(NULL, &(p->ebr->pte[1]), base, false); 276 else { 277 tmp = list_get_instance(l->next, mbr_part_t, link); 278 //debug_print((unsigned char*) p->ebr, 512); 279 printf("DEBUG: base: %u, tmp: start: %u, end: %u\n", base, tmp->start_addr, tmp->start_addr + tmp->length); 280 //encode_part(tmp, &(p->ebr->pte[1]), base); 281 encode_part(tmp, &(p->ebr->pte[1]), base, true); 282 debug_print(((unsigned char*) p->ebr) + 446, 32); 283 } 284 273 285 rc = block_write_direct(dev_handle, base, 1, p->ebr); 274 286 if (rc != EOK) { 275 287 DEBUG_PRINT_2(LIBMBR_NAME ": Error (%d): %s.\n", rc, str_error(rc)); 276 288 goto end; 277 } 278 289 }*/ 290 279 291 l = l->next; 280 } 281 282 283 292 } else 293 goto no_logical; 294 295 //prev_addr = base; 296 prev_p = p; 297 284 298 // Encoding and writing logical partitions 285 299 while (l != &(parts->list.head)) { 286 300 p = list_get_instance(l, mbr_part_t, link); 287 if (p->ebr == NULL) { 288 p->ebr = alloc_br(); 289 if (p->ebr == NULL) { 290 rc = ENOMEM; 291 goto end; 292 } 293 } 294 295 addr = p->start_addr - base; 296 encode_part(p, &(p->ebr->pte[0]), addr); 297 298 if (l->next == &(parts->list.head)) 299 encode_part(NULL, &(p->ebr->pte[1]), base); 301 302 /* Checking whether EBR address makes sense. If not, we take a guess. 303 * So far this is simple, we just take the first preceeding sector. 304 * Fdisk always reserves at least 2048 sectors (1MiB), so it can have 305 * the EBR aligned as well as the partition itself. Parted reserves 306 * minimum one sector, like we do. 307 * 308 * Note that we know there is at least one sector free from previous checks. 309 * Also note that the user can set ebr_addr to their liking (if it's valid). */ 310 if (p->ebr_addr >= p->start_addr || p->ebr_addr <= (prev_p->start_addr + prev_p->length)) { 311 p->ebr_addr = p->start_addr - 1; 312 DEBUG_PRINT_0(LIBMBR_NAME ": Warning: invalid EBR address.\n"); 313 } 314 315 encode_part(p, &(p->ebr->pte[0]), p->ebr_addr, false); 316 debug_print(((unsigned char*) p->ebr) + 446, 32); 317 encode_part(p, &(prev_p->ebr->pte[1]), base, true); 318 debug_print(((unsigned char*) prev_p->ebr) + 446, 32); 319 /*if (l->next == &(parts->list.head)) 320 encode_part(NULL, &(p->ebr->pte[1]), base, false); 300 321 else 301 encode_part(list_get_instance(l->next, mbr_part_t, link), &(p->ebr->pte[1]), base );302 303 304 rc = block_write_direct(dev_handle, addr, 1,p->ebr);322 encode_part(list_get_instance(l->next, mbr_part_t, link), &(p->ebr->pte[1]), base, true); 323 */ 324 325 rc = block_write_direct(dev_handle, prev_p->ebr_addr, 1, prev_p->ebr); 305 326 if (rc != EOK) { 306 327 DEBUG_PRINT_2(LIBMBR_NAME ": Error (%d): %s.\n", rc, str_error(rc)); 307 328 goto end; 308 329 } 309 330 331 prev_p = p; 310 332 l = l->next; 311 333 } 312 334 335 encode_part(NULL, &(prev_p->ebr->pte[1]), 0, false); 336 rc = block_write_direct(dev_handle, prev_p->ebr_addr, 1, prev_p->ebr); 337 if (rc != EOK) { 338 DEBUG_PRINT_2(LIBMBR_NAME ": Error (%d): %s.\n", rc, str_error(rc)); 339 goto end; 340 } 341 342 no_logical: 313 343 no_extended: 314 344 315 345 /*if (ext == NULL) 316 346 goto no_extended; … … 514 544 p = p->next; 515 545 }*/ 516 546 517 547 rc = EOK; 518 548 519 549 end: 520 550 block_fini(dev_handle); 521 551 522 552 return rc; 523 553 } … … 536 566 p->start_addr = 0; 537 567 p->length = 0; 568 p->ebr_addr = 0; 538 569 539 570 return p; … … 561 592 int mbr_add_partition(mbr_partitions_t * parts, mbr_part_t * p) 562 593 { 563 if (mbr_get_flag(p, ST_LOGIC)) { 564 // adding logical part 594 if (mbr_get_flag(p, ST_LOGIC)) { // adding logical part 565 595 if (parts->l_extended == NULL) { 566 596 return ERR_NO_EXTENDED; 567 597 } 568 if (!check_encaps(p, list_get_instance(parts->l_extended, mbr_part_t, link))) { 598 mbr_part_t * ext = list_get_instance(parts->l_extended, mbr_part_t, link); 599 if (!check_encaps(p, ext)) { 600 //printf("DEBUG: OOB: start: %u, end: %u\n", h->start_addr, h->start_addr + h->length); 601 //printf("DEBUG: OOB: start: %u, end: %u\n", p->start_addr, p->start_addr + p->length); 569 602 return ERR_OUT_BOUNDS; 570 603 } 571 604 572 605 mbr_part_t * last = list_get_instance(list_last(&(parts->list)), mbr_part_t, link); 606 mbr_part_t * iter; 607 uint32_t ebr_space = 1; 573 608 mbr_part_foreach(parts, iter) { 574 609 if (mbr_get_flag(iter, ST_LOGIC)) { 575 610 if (check_overlap(p, iter)) { 611 //printf("DEBUG: overlap: start: %u, end: %u\n", iter->start_addr, iter->start_addr + iter->length); 612 //printf("DEBUG: overlap: start: %u, end: %u\n", p->start_addr, p->start_addr + p->length); 576 613 return ERR_OVERLAP; 577 614 } 578 if (check_preceeds( p, iter)) {615 if (check_preceeds(iter, p)) { 579 616 last = iter; 617 ebr_space = p->start_addr - (last->start_addr + last->length); 618 } else 580 619 break; 581 }582 620 } 583 621 } 584 622 623 // checking if there's at least one sector of space preceeding 624 625 if (ebr_space < 1) 626 return ERR_NO_EBR; 627 628 // checking if there's at least one sector of space following (for following partitions's EBR) 629 if (last->link.next != &(parts->list.head)) { 630 if (list_get_instance(&(last->link.next), mbr_part_t, link)->start_addr <= p->start_addr + p->length + 1) { 631 return ERR_NO_EBR; 632 } 633 } 634 635 if (p->ebr == NULL) { 636 p->ebr = alloc_br(); 637 if (p->ebr == NULL) { 638 return ERR_NOMEM; 639 } 640 } 641 642 //printf("DEBUG: last: start: %u\n", last->start_addr); 585 643 //list_prepend(&(p->link), &(parts->list)); 586 list_insert_ before(&(p->link), &(last->link));644 list_insert_after(&(p->link), &(last->link)); 587 645 parts->n_logical += 1; 588 646 } else { … … 591 649 return ERR_PRIMARY_FULL; 592 650 } 651 652 // should we check if it's inside the drive's upper boundary? 653 if (p->start_addr == 0) { 654 return ERR_OUT_BOUNDS; 655 } 656 593 657 if (p->type == PT_EXTENDED && parts->l_extended != NULL) { 594 658 return ERR_EXTENDED_PRESENT; … … 598 662 list_append(&(p->link), &(parts->list)); 599 663 } else { 664 mbr_part_t * iter; 600 665 mbr_part_foreach(parts, iter) { 601 666 if (mbr_get_flag(iter, ST_LOGIC)) { 602 667 list_insert_before(&(p->link), &(iter->link)); 603 parts->n_primary += 1;604 668 break; 605 669 } else if (check_overlap(p, iter)) { … … 607 671 } 608 672 } 609 } 673 if (iter == list_get_instance(&(parts->list.head.prev), mbr_part_t, link)) { 674 list_append(&(p->link), &(parts->list)); 675 } 676 677 } 678 parts->n_primary += 1; 610 679 } 611 680 … … 663 732 } 664 733 734 /** Get next aligned address (in sectors!) */ 735 uint32_t mbr_get_next_aligned(uint32_t addr, unsigned int alignment) 736 { 737 uint32_t div = addr / alignment; 738 return (div + 1) * alignment; 739 } 740 665 741 /** Just a wrapper for free() */ 666 742 void mbr_free_mbr(mbr_t * mbr) … … 691 767 if (br == NULL) 692 768 return NULL; 693 769 770 memset(br, 0, 512); 694 771 br->media_id = 0; 695 772 br->pad0 = 0; 696 773 br->signature = host2uint16_t_le(BR_SIGNATURE); 697 774 698 775 return br; 699 776 } … … 733 810 uint32_t addr = base; 734 811 br_block_t * ebr; 735 812 736 813 rc = block_init(EXCHANGE_ATOMIC, mbr->device, 512); 737 814 if (rc != EOK) 738 815 return rc; 739 816 740 817 ebr = alloc_br(); 741 818 if (ebr == NULL) { … … 743 820 goto end; 744 821 } 745 822 746 823 rc = block_read_direct(mbr->device, addr, 1, ebr); 747 824 if (rc != EOK) { 748 825 goto free_ebr_end; 749 826 } 750 827 751 828 if (uint16_t_le2host(ebr->signature) != BR_SIGNATURE) { 752 829 rc = EINVAL; 753 830 goto free_ebr_end; 754 831 } 755 832 756 833 if (ebr->pte[0].ptype == PT_UNUSED) { 757 834 rc = EOK; 758 835 goto free_ebr_end; 759 836 } 760 837 761 838 p = mbr_alloc_partition(); 762 839 if (p == NULL) { … … 764 841 goto free_ebr_end; 765 842 } 766 767 843 768 844 decode_part(&(ebr->pte[0]), p, base); 769 845 mbr_set_flag(p, ST_LOGIC, true); 770 846 p->ebr = ebr; 771 mbr_add_partition(parts, p); 772 847 p->ebr_addr = addr; 848 rc = mbr_add_partition(parts, p); 849 if (rc != ERR_OK) { 850 printf(LIBMBR_NAME ": Error occured during decoding the MBR. (%d)\n" \ 851 LIBMBR_NAME ": Partition list may be incomplete.\n", rc); 852 return EINVAL; 853 } 854 773 855 addr = uint32_t_le2host(ebr->pte[1].first_lba) + base; 774 856 printf("DEBUG: b: %u, a: %u, start: %u\n", base, addr, ebr->pte[1].first_lba); 857 775 858 while (ebr->pte[1].ptype != PT_UNUSED) { 776 859 ebr = alloc_br(); … … 779 862 goto end; 780 863 } 781 864 782 865 rc = block_read_direct(mbr->device, addr, 1, ebr); 783 866 if (rc != EOK) { 784 867 goto free_ebr_end; 785 868 } 786 869 787 870 if (uint16_t_le2host(ebr->signature) != BR_SIGNATURE) { 788 871 rc = EINVAL; 789 872 goto free_ebr_end; 790 873 } 791 874 792 875 p = mbr_alloc_partition(); 793 876 if (p == NULL) { … … 795 878 goto free_ebr_end; 796 879 } 797 798 decode_part(&(ebr->pte[0]), p, base); 880 881 //printf("DEBUG: b: %u, a: %u, start: %u\n", base, addr, ebr->pte[0].first_lba); 882 decode_part(&(ebr->pte[0]), p, addr); 799 883 mbr_set_flag(p, ST_LOGIC, true); 800 884 p->ebr = ebr; 801 mbr_add_partition(parts, p); 802 885 p->ebr_addr = addr; 886 rc = mbr_add_partition(parts, p); 887 if (rc != ERR_OK) { 888 printf(LIBMBR_NAME ": Error occured during decoding the MBR. (%d)\n" \ 889 LIBMBR_NAME ": Partition list may be incomplete.\n", rc); 890 return EINVAL; 891 } 892 803 893 addr = uint32_t_le2host(ebr->pte[1].first_lba) + base; 804 894 } 805 895 806 896 rc = EOK; 807 897 goto end; 898 808 899 free_ebr_end: 809 900 free(ebr); 810 901 811 902 end: 812 903 block_fini(mbr->device); 813 904 814 905 return rc; 815 906 } 816 907 817 908 /** Convert mbr_part_t to pt_entry_t */ 818 static void encode_part(mbr_part_t * src, pt_entry_t * trgt, uint32_t base )909 static void encode_part(mbr_part_t * src, pt_entry_t * trgt, uint32_t base, bool ebr) 819 910 { 820 911 if (src != NULL) { 821 912 trgt->status = mbr_get_flag(src, ST_BOOT) ? B_ACTIVE : B_INACTIVE; 822 trgt->ptype = src->type; 823 trgt->first_lba = host2uint32_t_le(src->start_addr - base); 824 trgt->length = host2uint32_t_le(src->length); 913 if (ebr) { // encoding reference to EBR 914 trgt->ptype = PT_EXTENDED_LBA; 915 trgt->first_lba = host2uint32_t_le(src->ebr_addr - base); 916 trgt->length = host2uint32_t_le(src->length + src->start_addr - src->ebr_addr); 917 } else { // encoding reference to partition 918 trgt->ptype = src->type; 919 trgt->first_lba = host2uint32_t_le(src->start_addr - base); 920 trgt->length = host2uint32_t_le(src->length); 921 } 825 922 } else { 826 923 trgt->status = 0; … … 839 936 static int check_overlap(mbr_part_t * p1, mbr_part_t * p2) 840 937 { 841 if (p1->start_addr < p2->start_addr && p1->start_addr + p1->length < =p2->start_addr) {938 if (p1->start_addr < p2->start_addr && p1->start_addr + p1->length < p2->start_addr) { 842 939 return 0; 843 } else if (p1->start_addr > p2->start_addr && p2->start_addr + p2->length < =p1->start_addr) {940 } else if (p1->start_addr > p2->start_addr && p2->start_addr + p2->length < p1->start_addr) { 844 941 return 0; 845 942 } … … 864 961 } 865 962 866 867 963 static void debug_print(unsigned char * data, size_t bytes) 964 { 965 size_t addr = 0; 966 int i; 967 968 while (bytes >= 16) { 969 printf("%8x ", addr); 970 for (i = 0; i < 8; i++) { 971 printf(" %2hhx", data[addr + i]); 972 } 973 printf(" "); 974 for (i = 0; i < 8; i++) { 975 printf(" %2hhx", data[addr + i + 8]); 976 } 977 printf("\n"); 978 979 bytes -= 16; 980 addr += 16; 981 } 982 983 984 } 985 986 987 -
uspace/lib/mbr/libmbr.h
rd617050 r8f6c7785 84 84 /** Extended partition */ 85 85 PT_EXTENDED = 0x05, 86 /** Extended partition with LBA */ 87 PT_EXTENDED_LBA = 0x0F, 86 88 /** GPT Protective partition */ 87 89 PT_GPT = 0xEE, … … 101 103 /** Logical partition out of bounds */ 102 104 ERR_OUT_BOUNDS, 105 /** No space left for EBR */ 106 ERR_NO_EBR, 107 /** Out of memory */ 108 ERR_NOMEM, 103 109 } MBR_ERR_VAL; 104 110 … … 156 162 /** Points to Extended Boot Record of logical partition */ 157 163 br_block_t * ebr; 164 /** EBR address */ 165 uint32_t ebr_addr; 158 166 } mbr_part_t; 159 167 … … 194 202 extern int mbr_get_flag(mbr_part_t * p, MBR_FLAGS flag); 195 203 extern void mbr_set_flag(mbr_part_t * p, MBR_FLAGS flag, bool value); 204 extern uint32_t mbr_get_next_aligned(uint32_t addr, unsigned int alignment); 196 205 197 206 #define mbr_part_foreach(parts, iterator) \ 198 for ( mbr_part_t * iterator= list_get_instance((parts)->list.head.next, mbr_part_t, link); \199 iterator != list_get_instance(&(parts)->list.head, mbr_part_t, link); \200 iterator= list_get_instance(iterator->link.next, mbr_part_t, link))207 for (iterator = list_get_instance((parts)->list.head.next, mbr_part_t, link); \ 208 iterator != list_get_instance(&((parts)->list.head), mbr_part_t, link); \ 209 iterator = list_get_instance(iterator->link.next, mbr_part_t, link)) 201 210 202 211
Note:
See TracChangeset
for help on using the changeset viewer.