| Index: embios/trunk/target/ipodnano2g/nand.c | 
| — | — | @@ -94,7 +94,6 @@ | 
| 95 | 95 | static struct mutex ecc_mtx; | 
| 96 | 96 | static struct wakeup ecc_wakeup; | 
| 97 | 97 |  | 
| 98 |  | -static uint8_t nand_data[0x800] CACHEALIGN_ATTR;
 | 
| 99 | 98 | static uint8_t nand_ctrl[0x200] CACHEALIGN_ATTR; | 
| 100 | 99 | static uint8_t nand_spare[0x40] CACHEALIGN_ATTR; | 
| 101 | 100 | static uint8_t nand_ecc[0x30] CACHEALIGN_ATTR; | 
| — | — | @@ -375,12 +374,17 @@ | 
| 376 | 375 | void* sparebuffer, uint32_t doecc, | 
| 377 | 376 | uint32_t checkempty) | 
| 378 | 377 | { | 
| 379 |  | -    uint8_t* data = nand_data;
 | 
|  | 378 | +    uint8_t* data = (uint8_t*)databuffer; | 
| 380 | 379 | uint8_t* spare = nand_spare; | 
| 381 |  | -    if (databuffer && !((uint32_t)databuffer & 0xf))
 | 
| 382 |  | -        data = (uint8_t*)databuffer;
 | 
| 383 |  | -    if (sparebuffer && !((uint32_t)sparebuffer & 0xf))
 | 
| 384 |  | -        spare = (uint8_t*)sparebuffer;
 | 
|  | 380 | +    if (sparebuffer) spare = (uint8_t*)sparebuffer; | 
|  | 381 | +	if ((uint32_t)databuffer & 0xf) | 
|  | 382 | +		panicf(PANIC_KILLUSERTHREADS, | 
|  | 383 | +	           "nand_read_page: Misaligned data buffer at %08X (bank %lu, page %lu)", | 
|  | 384 | +			   (unsigned int)databuffer, bank, page); | 
|  | 385 | +	if ((uint32_t)sparebuffer & 0xf) | 
|  | 386 | +		panicf(PANIC_KILLUSERTHREADS, | 
|  | 387 | +	           "nand_read_page: Misaligned spare buffer at %08X (bank %lu, page %lu)", | 
|  | 388 | +			   (unsigned int)sparebuffer, bank, page); | 
| 385 | 389 | mutex_lock(&nand_mtx, TIMEOUT_BLOCK); | 
| 386 | 390 | nand_last_activity_value = USEC_TIMER; | 
| 387 | 391 | if (!nand_powered) nand_power_up(); | 
| — | — | @@ -387,22 +391,21 @@ | 
| 388 | 392 | uint32_t rc, eccresult; | 
| 389 | 393 | nand_set_fmctrl0(bank, FMCTRL0_ENABLEDMA); | 
| 390 | 394 | if (nand_send_cmd(NAND_CMD_READ)) return nand_unlock(1); | 
| 391 |  | -    if (nand_send_address(page, databuffer ? 0 : 0x800))
 | 
|  | 395 | +    if (nand_send_address(page, data ? 0 : 0x800)) | 
| 392 | 396 | return nand_unlock(1); | 
| 393 | 397 | if (nand_send_cmd(NAND_CMD_READ2)) return nand_unlock(1); | 
| 394 | 398 | if (nand_wait_status_ready(bank)) return nand_unlock(1); | 
| 395 |  | -    if (databuffer)
 | 
|  | 399 | +    if (data) | 
| 396 | 400 | if (nand_transfer_data(bank, 0, data, 0x800)) | 
| 397 | 401 | return nand_unlock(1); | 
| 398 | 402 | rc = 0; | 
| 399 | 403 | if (!doecc) | 
| 400 | 404 | { | 
| 401 |  | -        if (databuffer && data != databuffer) memcpy(databuffer, data, 0x800);
 | 
| 402 | 405 | if (sparebuffer) | 
| 403 | 406 | { | 
| 404 | 407 | if (nand_transfer_data(bank, 0, spare, 0x40)) | 
| 405 | 408 | return nand_unlock(1); | 
| 406 |  | -            if (sparebuffer && spare != sparebuffer) 
 | 
|  | 409 | +            if (sparebuffer) | 
| 407 | 410 | memcpy(sparebuffer, spare, 0x800); | 
| 408 | 411 | if (checkempty) | 
| 409 | 412 | rc = nand_check_empty((uint8_t*)sparebuffer) << 1; | 
| — | — | @@ -414,7 +417,6 @@ | 
| 415 | 418 | { | 
| 416 | 419 | memcpy(nand_ecc, &spare[0xC], 0x28); | 
| 417 | 420 | rc |= (ecc_decode(3, data, nand_ecc) & 0xF) << 4; | 
| 418 |  | -        if (data != databuffer) memcpy(databuffer, data, 0x800);
 | 
| 419 | 421 | } | 
| 420 | 422 | memset(nand_ctrl, 0xFF, 0x200); | 
| 421 | 423 | memcpy(nand_ctrl, spare, 0xC); | 
| — | — | @@ -423,7 +425,6 @@ | 
| 424 | 426 | rc |= (eccresult & 0xF) << 8; | 
| 425 | 427 | if (sparebuffer) | 
| 426 | 428 | { | 
| 427 |  | -        if (spare != sparebuffer) memcpy(sparebuffer, spare, 0x40);
 | 
| 428 | 429 | if (eccresult & 1) memset(sparebuffer, 0xFF, 0xC); | 
| 429 | 430 | else memcpy(sparebuffer, nand_ctrl, 0xC); | 
| 430 | 431 | } | 
| — | — | @@ -436,26 +437,26 @@ | 
| 437 | 438 | void* databuffer, void* sparebuffer, | 
| 438 | 439 | uint32_t doecc, uint32_t wait) | 
| 439 | 440 | { | 
| 440 |  | -    uint8_t* data = nand_data;
 | 
|  | 441 | +    uint8_t* data = (uint8_t*)databuffer; | 
| 441 | 442 | uint8_t* spare = nand_spare; | 
| 442 |  | -    if (databuffer && !((uint32_t)databuffer & 0xf))
 | 
| 443 |  | -        data = (uint8_t*)databuffer;
 | 
| 444 |  | -    if (sparebuffer && !((uint32_t)sparebuffer & 0xf))
 | 
| 445 |  | -        spare = (uint8_t*)sparebuffer;
 | 
|  | 443 | +    if (sparebuffer) spare = (uint8_t*)sparebuffer; | 
|  | 444 | +	if ((uint32_t)databuffer & 0xf) | 
|  | 445 | +		panicf(PANIC_KILLUSERTHREADS, | 
|  | 446 | +	           "nand_write_page: Misaligned data buffer at %08X (bank %lu, page %lu)", | 
|  | 447 | +			   (unsigned int)databuffer, bank, page); | 
|  | 448 | +	if ((uint32_t)sparebuffer & 0xf) | 
|  | 449 | +		panicf(PANIC_KILLUSERTHREADS, | 
|  | 450 | +	           "nand_write_page: Misaligned spare buffer at %08X (bank %lu, page %lu)", | 
|  | 451 | +			   (unsigned int)sparebuffer, bank, page); | 
| 446 | 452 | mutex_lock(&nand_mtx, TIMEOUT_BLOCK); | 
| 447 | 453 | nand_last_activity_value = USEC_TIMER; | 
| 448 | 454 | if (!nand_powered) nand_power_up(); | 
| 449 |  | -    if (sparebuffer)
 | 
| 450 |  | -    {
 | 
| 451 |  | -        if (spare != sparebuffer) memcpy(spare, sparebuffer, 0x40);
 | 
| 452 |  | -    }
 | 
| 453 |  | -    else memset(spare, 0xFF, 0x40);
 | 
|  | 455 | +    if (!sparebuffer) memset(spare, 0xFF, 0x40); | 
| 454 | 456 | nand_set_fmctrl0(bank, FMCTRL0_ENABLEDMA); | 
| 455 | 457 | if (nand_send_cmd(NAND_CMD_PROGRAM)) return nand_unlock(1); | 
| 456 |  | -    if (nand_send_address(page, databuffer ? 0 : 0x800))
 | 
|  | 458 | +    if (nand_send_address(page, data ? 0 : 0x800)) | 
| 457 | 459 | return nand_unlock(1); | 
| 458 |  | -    if (databuffer && data != databuffer) memcpy(data, databuffer, 0x800);
 | 
| 459 |  | -    if (databuffer) nand_transfer_data_start(bank, 1, data, 0x800);
 | 
|  | 460 | +    if (data) nand_transfer_data_start(bank, 1, data, 0x800); | 
| 460 | 461 | if (doecc) | 
| 461 | 462 | { | 
| 462 | 463 | if (ecc_encode(3, data, nand_ecc)) return nand_unlock(1); | 
| — | — | @@ -465,7 +466,7 @@ | 
| 466 | 467 | if (ecc_encode(0, nand_ctrl, nand_ecc)) return nand_unlock(1); | 
| 467 | 468 | memcpy(&spare[0x34], nand_ecc, 0xC); | 
| 468 | 469 | } | 
| 469 |  | -    if (databuffer)
 | 
|  | 470 | +    if (data) | 
| 470 | 471 | if (nand_transfer_data_collect(1)) | 
| 471 | 472 | return nand_unlock(1); | 
| 472 | 473 | if (sparebuffer || doecc) | 
| Index: embios/trunk/target/ipodnano2g/ftl.c | 
| — | — | @@ -1287,6 +1287,11 @@ | 
| 1288 | 1288 | DEBUGF("FTL: Reading %d sectors starting at %d", count, sector); | 
| 1289 | 1289 | #endif | 
| 1290 | 1290 |  | 
|  | 1291 | +	if ((uint32_t)buffer & 0xf) | 
|  | 1292 | +		panicf(PANIC_KILLTHREAD, | 
|  | 1293 | +		       "ftl_read: Misaligned data buffer at %08X (sector %lu, count %lu)", | 
|  | 1294 | +			   (unsigned int)buffer, sector, count); | 
|  | 1295 | + | 
| 1291 | 1296 | if (sector + count > ftl_nand_type->userblocks * ppb) | 
| 1292 | 1297 | { | 
| 1293 | 1298 | DEBUGF("FTL: Sector %d is out of range!", sector + count - 1); | 
| — | — | @@ -1942,6 +1947,11 @@ | 
| 1943 | 1948 | DEBUGF("FTL: Writing %d sectors starting at %d", count, sector); | 
| 1944 | 1949 | #endif | 
| 1945 | 1950 |  | 
|  | 1951 | +	if ((uint32_t)buffer & 0xf) | 
|  | 1952 | +		panicf(PANIC_KILLTHREAD, | 
|  | 1953 | +		       "ftl_write: Misaligned data buffer at %08X (sector %lu, count %lu)", | 
|  | 1954 | +			   (unsigned int)buffer, sector, count); | 
|  | 1955 | + | 
| 1946 | 1956 | if (sector + count > ftl_nand_type->userblocks * ppb) | 
| 1947 | 1957 | { | 
| 1948 | 1958 | DEBUGF("FTL: Sector %d is out of range!", sector + count - 1); |