kernel/eka/include/slab.h
author hgs
Mon, 27 Sep 2010 10:52:00 +0100
changeset 273 6a75fa55495f
parent 189 a5496987b1da
permissions -rw-r--r--
201037_09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
189
a5496987b1da 201025_04
hgs
parents:
diff changeset
     1
// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
a5496987b1da 201025_04
hgs
parents:
diff changeset
     2
// All rights reserved.
a5496987b1da 201025_04
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
a5496987b1da 201025_04
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
a5496987b1da 201025_04
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
a5496987b1da 201025_04
hgs
parents:
diff changeset
     7
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
     8
// Initial Contributors:
a5496987b1da 201025_04
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
a5496987b1da 201025_04
hgs
parents:
diff changeset
    10
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    11
// Contributors:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    12
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    13
// Description:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    14
// kernel\eka\include\slab.h
a5496987b1da 201025_04
hgs
parents:
diff changeset
    15
// 
a5496987b1da 201025_04
hgs
parents:
diff changeset
    16
//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    17
a5496987b1da 201025_04
hgs
parents:
diff changeset
    18
#ifndef __KERNEL_MODE__
a5496987b1da 201025_04
hgs
parents:
diff changeset
    19
a5496987b1da 201025_04
hgs
parents:
diff changeset
    20
class slab;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    21
class slabhdr;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    22
#define MAXSLABSIZE		56
a5496987b1da 201025_04
hgs
parents:
diff changeset
    23
#define	PAGESHIFT		12
a5496987b1da 201025_04
hgs
parents:
diff changeset
    24
#define PAGESIZE		(1<<PAGESHIFT)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    25
#define	SLABSHIFT		10
a5496987b1da 201025_04
hgs
parents:
diff changeset
    26
#define	SLABSIZE		(1 << SLABSHIFT)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    27
#define CELLALIGN		8
a5496987b1da 201025_04
hgs
parents:
diff changeset
    28
a5496987b1da 201025_04
hgs
parents:
diff changeset
    29
a5496987b1da 201025_04
hgs
parents:
diff changeset
    30
const unsigned slabfull  = 0;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    31
const TInt	slabsperpage = (int)(PAGESIZE/SLABSIZE);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    32
#define HIBIT(bits) (((unsigned)bits & 0xc) ? 2 + ((unsigned)bits>>3) : ((unsigned) bits>>1))
a5496987b1da 201025_04
hgs
parents:
diff changeset
    33
a5496987b1da 201025_04
hgs
parents:
diff changeset
    34
#define LOWBIT(bits)	(((unsigned) bits&3) ? 1 - ((unsigned)bits&1) : 3 - (((unsigned)bits>>2)&1))
a5496987b1da 201025_04
hgs
parents:
diff changeset
    35
a5496987b1da 201025_04
hgs
parents:
diff changeset
    36
#define ZEROBITS(header)	(((unsigned)header & 0x70000000) ? 0 : 1)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    37
a5496987b1da 201025_04
hgs
parents:
diff changeset
    38
class slabhdr
a5496987b1da 201025_04
hgs
parents:
diff changeset
    39
{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    40
	public:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    41
		unsigned iHeader;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    42
		// made up of
a5496987b1da 201025_04
hgs
parents:
diff changeset
    43
		// bits   |    31    | 30..28 | 27..18 | 17..12 |  11..8  |   7..0   |
a5496987b1da 201025_04
hgs
parents:
diff changeset
    44
		//        +----------+--------+--------+--------+---------+----------+
a5496987b1da 201025_04
hgs
parents:
diff changeset
    45
		// field  | floating |  zero  | used-4 |  size  | pagemap | free pos |
a5496987b1da 201025_04
hgs
parents:
diff changeset
    46
		//
a5496987b1da 201025_04
hgs
parents:
diff changeset
    47
		slab** iParent;		// reference to iParent's pointer to this slab in tree
a5496987b1da 201025_04
hgs
parents:
diff changeset
    48
		slab* iChild1;		// 1st iChild in tree
a5496987b1da 201025_04
hgs
parents:
diff changeset
    49
		slab* iChild2;		// 2nd iChild in tree
a5496987b1da 201025_04
hgs
parents:
diff changeset
    50
};
a5496987b1da 201025_04
hgs
parents:
diff changeset
    51
a5496987b1da 201025_04
hgs
parents:
diff changeset
    52
const TInt KMaxSlabPayload = SLABSIZE - sizeof(slabhdr);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    53
#define MAXUSEDM4BITS   0x0fc00000
a5496987b1da 201025_04
hgs
parents:
diff changeset
    54
#define FLOATING_BIT    0x80000000
a5496987b1da 201025_04
hgs
parents:
diff changeset
    55
a5496987b1da 201025_04
hgs
parents:
diff changeset
    56
inline unsigned HeaderFloating(unsigned h)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    57
{return (h&0x80000000);}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    58
const unsigned maxuse = (SLABSIZE - sizeof(slabhdr))>>2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    59
const unsigned firstpos = sizeof(slabhdr)>>2;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    60
a5496987b1da 201025_04
hgs
parents:
diff changeset
    61
#ifdef _DEBUG
a5496987b1da 201025_04
hgs
parents:
diff changeset
    62
#define CHECKTREE(x) DoCheckSlabTree(x,EFalse)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    63
#define CHECKSLAB(s,t,p) DoCheckSlab(s,t,p)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    64
#define CHECKSLABBFR(s,p) {TUint32 b[4]; BuildPartialSlabBitmap(b,s,p);}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    65
#else
a5496987b1da 201025_04
hgs
parents:
diff changeset
    66
#define CHECKTREE(x) (void)0
a5496987b1da 201025_04
hgs
parents:
diff changeset
    67
#define CHECKSLAB(s,t,p) (void)0
a5496987b1da 201025_04
hgs
parents:
diff changeset
    68
#define CHECKSLABBFR(s,p) (void)0
a5496987b1da 201025_04
hgs
parents:
diff changeset
    69
#endif
a5496987b1da 201025_04
hgs
parents:
diff changeset
    70
a5496987b1da 201025_04
hgs
parents:
diff changeset
    71
class slabset
a5496987b1da 201025_04
hgs
parents:
diff changeset
    72
{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    73
	public:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    74
		slab* iPartial;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    75
};
a5496987b1da 201025_04
hgs
parents:
diff changeset
    76
a5496987b1da 201025_04
hgs
parents:
diff changeset
    77
class slab : public slabhdr
a5496987b1da 201025_04
hgs
parents:
diff changeset
    78
{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    79
	public:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    80
		void Init(unsigned clz);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    81
		//static slab* SlabFor( void* p);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    82
		static slab* SlabFor(const void* p) ;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    83
		unsigned char iPayload[SLABSIZE-sizeof(slabhdr)];
a5496987b1da 201025_04
hgs
parents:
diff changeset
    84
};
a5496987b1da 201025_04
hgs
parents:
diff changeset
    85
a5496987b1da 201025_04
hgs
parents:
diff changeset
    86
class page
a5496987b1da 201025_04
hgs
parents:
diff changeset
    87
{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    88
	public:
a5496987b1da 201025_04
hgs
parents:
diff changeset
    89
		inline static page* PageFor(slab* s);
a5496987b1da 201025_04
hgs
parents:
diff changeset
    90
		//slab iSlabs;
a5496987b1da 201025_04
hgs
parents:
diff changeset
    91
		slab iSlabs[slabsperpage];
a5496987b1da 201025_04
hgs
parents:
diff changeset
    92
};
a5496987b1da 201025_04
hgs
parents:
diff changeset
    93
a5496987b1da 201025_04
hgs
parents:
diff changeset
    94
a5496987b1da 201025_04
hgs
parents:
diff changeset
    95
inline page* page::PageFor(slab* s)
a5496987b1da 201025_04
hgs
parents:
diff changeset
    96
{
a5496987b1da 201025_04
hgs
parents:
diff changeset
    97
	return reinterpret_cast<page*>((unsigned(s))&~(PAGESIZE-1));
a5496987b1da 201025_04
hgs
parents:
diff changeset
    98
}
a5496987b1da 201025_04
hgs
parents:
diff changeset
    99
a5496987b1da 201025_04
hgs
parents:
diff changeset
   100
a5496987b1da 201025_04
hgs
parents:
diff changeset
   101
#endif   // __KERNEL_MODE__