1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     ro_SectionTable.h
4   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
5   These coded instructions, statements, and computer programs contain
6   proprietary information of Nintendo of America Inc. and/or Nintendo
7   Company Ltd., and are protected by Federal copyright law. They may
8   not be disclosed to third parties or copied or duplicated in any form,
9   in whole or in part, without the prior written consent of Nintendo.
10   $Rev: 37159 $
11  *---------------------------------------------------------------------------
12 
13 
14 */
15 
16 #ifndef NN_RO_RO_SECTIONTABLE_H_
17 #define NN_RO_RO_SECTIONTABLE_H_
18 
19 #include <nn/types.h>
20 #include <nn/util/util_SizedEnum.h>
21 #include <nn/drivers/ro/ro_Types.h>
22 #include <nn/ro/ro_Types.h>
23 
24 namespace nn { namespace ro { namespace detail {
25 
26 
27 
28     //---------------------------------------------------------------------------
29     //
30     //
31     //---------------------------------------------------------------------------
32     class SectionTable
33     {
34     private:
35         const nn::drivers::ro::SectionInfo*  m_pSectionTable;
36         s32                 m_NumSections;
37 
38     public:
39         //---------------------------------------------------------------------------
40         //
41         //
42         //
43         //---------------------------------------------------------------------------
SectionTable(const nn::drivers::ro::ObjectHeader * pModule)44         SectionTable(const nn::drivers::ro::ObjectHeader* pModule)
45             : m_pSectionTable(pModule->sectionInfo)
46             , m_NumSections(pModule->numSections)
47         {
48         }
49 
50         //---------------------------------------------------------------------------
51         //
52         //
53         //
54         //
55         //
56         //
57         //
58         //
59         //
60         //---------------------------------------------------------------------------
GetSection(int index)61         const nn::drivers::ro::SectionInfo* GetSection(int index) const
62         {
63             if( (0 <= index) && (index < m_NumSections) )
64             {
65                 return &m_pSectionTable[index];
66             }
67             else
68             {
69                 return NULL;
70             }
71         }
72 
73         //---------------------------------------------------------------------------
74         //
75         //
76         //
77         //
78         //
79         //
80         //
81         //
82         //
83         //
84         //
85         //
86         //
87         //---------------------------------------------------------------------------
GetAddress(int index,u32 offset)88         uptr GetAddress(int index, u32 offset) const
89         {
90             if( ! ((0 <= index) && (index < m_NumSections)) )
91             {
92                 return NULL;
93             }
94 
95             const nn::drivers::ro::SectionInfo& section = m_pSectionTable[index];
96 
97             if( ! (offset < section.size) )
98             {
99                 return NULL;
100             }
101 
102             return section.offset + offset;
103         }
104 
105         //---------------------------------------------------------------------------
106         //
107         //
108         //
109         //
110         //
111         //
112         //
113         //
114         //
115         //
116         //
117         //
118         //
119         //
120         //
121         //---------------------------------------------------------------------------
GetReferedAddress(int index,u32 offset)122         uptr GetReferedAddress(int index, u32 offset) const
123         {
124             if( ! ((0 <= index) && (index < m_NumSections)) )
125             {
126                 return NULL;
127             }
128 
129             const nn::drivers::ro::SectionInfo& section = m_pSectionTable[index];
130 
131             if( ! (offset <= section.size) )
132             {
133                 return NULL;
134             }
135 
136             return section.offset + offset;
137         }
138 
139         //---------------------------------------------------------------------------
140         //
141         //
142         //
143         //
144         //
145         //
146         //
147         //
148         //
149         //
150         //
151         //
152         //
153         //---------------------------------------------------------------------------
154         template<typename T>
GetPointer(int index,u32 offset)155         T GetPointer(int index, u32 offset) const
156         {
157             return reinterpret_cast<T>(GetAddress(index, offset));
158         }
159 
GetAddress(nn::drivers::ro::SectionAndOffset sao)160         uptr GetAddress(nn::drivers::ro::SectionAndOffset sao) const
161         {
162             return GetAddress(sao.GetFirst(), sao.GetSecond());
163         }
164 
165         template<typename T>
GetPointer(nn::drivers::ro::SectionAndOffset sao)166         T GetPointer(nn::drivers::ro::SectionAndOffset sao) const
167         {
168             return reinterpret_cast<T>(GetAddress(sao));
169         }
170     };
171 
172 
173 
174 }}}
175 
176 
177 
178 #endif  // ifndef NN_RO_RO_SECTIONTABLE_H_
179