package yaffs2.port;
import yaffs2.utils.*;
import yaffs2.utils.factory.PrimitiveWrapperFactory;
public class yaffs_packedtags2_C
{
/*
* YAFFS: Yet Another Flash File System. A NAND-flash specific file system.
*
* Copyright (C) 2002-2007 Aleph One Ltd.
* for Toby Churchill Ltd and Brightstar Engineering
*
* Created by Charles Manning <charles@aleph1.co.uk>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
// #include "yaffs_packedtags2.h"
// #include "yportenv.h"
// #include "yaffs_tagsvalidity.h"
/* This code packs a set of extended tags into a binary structure for
* NAND storage
*/
/* Some of the information is "extra" struff which can be packed in to
* speed scanning
* This is defined by having the EXTRA_HEADER_INFO_FLAG set.
*/
/* Extra flags applied to chunkId */
static final int EXTRA_HEADER_INFO_FLAG = 0x80000000; // PORT ok
static final int EXTRA_SHRINK_FLAG = 0x40000000;
static final int EXTRA_SHADOWS_FLAG = 0x20000000;
static final int EXTRA_SPARE_FLAGS = 0x10000000;
static final int ALL_EXTRA_FLAGS = 0xF0000000; // PORT ok
/* Also, the top 4 bits of the object Id are set to the object type. */
static final int EXTRA_OBJECT_TYPE_SHIFT = 28;
static final int EXTRA_OBJECT_TYPE_MASK = ((0x0F) << EXTRA_OBJECT_TYPE_SHIFT);
static void yaffs_DumpPackedTags2(yaffs_PackedTags2 pt)
{
yportenv.T(yportenv.YAFFS_TRACE_MTD,
("packed tags obj %d chunk %d byte %d seq %d" + ydirectenv.TENDSTR),
PrimitiveWrapperFactory.get(pt.t.objectId()), PrimitiveWrapperFactory.get(pt.t.chunkId()), PrimitiveWrapperFactory.get(pt.t.byteCount()),
PrimitiveWrapperFactory.get(pt.t.sequenceNumber()));
}
static void yaffs_DumpTags2(yaffs_ExtendedTags t)
{
yportenv.T(yportenv.YAFFS_TRACE_MTD,
("ext.tags eccres %d blkbad %b chused %b obj %d chunk%d byte " +
"%d del %b ser %d seq %d" +
ydirectenv.TENDSTR), PrimitiveWrapperFactory.get(t.eccResult), PrimitiveWrapperFactory.get(t.blockBad), PrimitiveWrapperFactory.get(t.chunkUsed), PrimitiveWrapperFactory.get(t.objectId),
PrimitiveWrapperFactory.get(t.chunkId), PrimitiveWrapperFactory.get(t.byteCount), PrimitiveWrapperFactory.get(t.chunkDeleted), PrimitiveWrapperFactory.get(t.serialNumber),
PrimitiveWrapperFactory.get(t.sequenceNumber));
}
public static void yaffs_PackTags2(yaffs_PackedTags2 pt, yaffs_ExtendedTags t)
{
pt.t.setChunkId(t.chunkId);
pt.t.setSequenceNumber(t.sequenceNumber);
pt.t.setByteCount(t.byteCount);
pt.t.setObjectId(t.objectId);
if (t.chunkId == 0 && t.extraHeaderInfoAvailable) {
/* Store the extra header info instead */
/* We save the parent object in the chunkId */
pt.t.setChunkId(EXTRA_HEADER_INFO_FLAG
| t.extraParentObjectId);
if (t.extraIsShrinkHeader) {
pt.t.orChunkId(EXTRA_SHRINK_FLAG);
}
if (t.extraShadows) {
pt.t.orChunkId(EXTRA_SHADOWS_FLAG);
}
pt.t.andObjectId(~EXTRA_OBJECT_TYPE_MASK);
pt.t.orObjectId(
(t.extraObjectType << EXTRA_OBJECT_TYPE_SHIFT));
if (t.extraObjectType == Guts_H.YAFFS_OBJECT_TYPE_HARDLINK) {
pt.t.setByteCount(t.extraEquivalentObjectId);
} else if (t.extraObjectType == Guts_H.YAFFS_OBJECT_TYPE_FILE) {
pt.t.setByteCount(t.extraFileLength);
} else {
pt.t.setByteCount(0);
}
}
yaffs_DumpPackedTags2(pt);
yaffs_DumpTags2(t);
// #ifndef YAFFS_IGNORE_TAGS_ECC
{
ECC_C.yaffs_ECCCalculateOther(/*(unsigned char *)&*/ pt.t/*,
sizeof(yaffs_PackedTags2TagsPart)*/ ,
pt.ecc);
}
// #endif
}
public static void yaffs_UnpackTags2(yaffs_ExtendedTags t, yaffs_PackedTags2 pt)
{
Unix.memset(t/*, 0, sizeof(yaffs_ExtendedTags)*/);
yaffs_tagsvalidity_C.yaffs_InitialiseTags(t);
if (pt.t.sequenceNumber() != 0xFFFFFFFF) {
/* Page is in use */
// #ifdef YAFFS_IGNORE_TAGS_ECC
// {
// t.eccResult = YAFFS_ECC_RESULT_NO_ERROR;
// }
// #else
{
yaffs_ECCOther ecc = new yaffs_ECCOther();
int result;
ECC_C.yaffs_ECCCalculateOther(/*(unsigned char *)&*/ pt.t,
/*sizeof
(yaffs_PackedTags2TagsPart),*/
ecc);
result =
ECC_C.yaffs_ECCCorrectOther(/*(unsigned char *)&*/ pt.t,
/*sizeof
(yaffs_PackedTags2TagsPart),*/
pt.ecc, ecc);
switch(result){
case 0:
t.eccResult = Guts_H.YAFFS_ECC_RESULT_NO_ERROR;
break;
case 1:
t.eccResult = Guts_H.YAFFS_ECC_RESULT_FIXED;
break;
case -1:
t.eccResult = Guts_H.YAFFS_ECC_RESULT_UNFIXED;
break;
default:
t.eccResult = Guts_H.YAFFS_ECC_RESULT_UNKNOWN;
}
}
// #endif
t.blockBad = false;
t.chunkUsed = true;
t.objectId = pt.t.objectId();
t.chunkId = pt.t.chunkId();
t.byteCount = pt.t.byteCount();
t.chunkDeleted = false;
t.serialNumber = 0;
t.sequenceNumber = pt.t.sequenceNumber();
/* Do extra header info stuff */
if ((pt.t.chunkId() & EXTRA_HEADER_INFO_FLAG) != 0) {
t.chunkId = 0;
t.byteCount = 0;
t.extraHeaderInfoAvailable = true;
t.extraParentObjectId =
pt.t.chunkId() & (~(ALL_EXTRA_FLAGS));
t.extraIsShrinkHeader =
(pt.t.chunkId() & EXTRA_SHRINK_FLAG) != 0;
t.extraShadows =
(pt.t.chunkId() & EXTRA_SHADOWS_FLAG) != 0;
t.extraObjectType =
pt.t.objectId() >>> EXTRA_OBJECT_TYPE_SHIFT;
t.objectId &= ~EXTRA_OBJECT_TYPE_MASK;
if (t.extraObjectType == Guts_H.YAFFS_OBJECT_TYPE_HARDLINK) {
t.extraEquivalentObjectId = pt.t.byteCount();
} else {
t.extraFileLength = pt.t.byteCount();
}
}
}
yaffs_DumpPackedTags2(pt);
yaffs_DumpTags2(t);
}
}