File indexing completed on 2025-05-11 08:23:54
0001 #include <bsp/residual.h>
0002 #include <stdint.h>
0003
0004
0005
0006
0007 #define KERNELBASE 0x01000000
0008
0009
0010
0011
0012
0013
0014
0015
0016 #define MEM_MEGS 32
0017
0018
0019
0020
0021 struct fake_data {
0022 unsigned long dat_len;
0023 unsigned long res_off;
0024 unsigned long cmd_off;
0025 unsigned long cmd_len;
0026 unsigned long img_adr;
0027 RESIDUAL fake_residual;
0028 char cmdline[1024];
0029 } fake_data = {
0030 dat_len: sizeof(fake_data),
0031 res_off: (unsigned long) &fake_data.fake_residual
0032 -(unsigned long) &fake_data,
0033 cmd_off: (unsigned long) &fake_data.cmdline
0034 -(unsigned long) &fake_data,
0035 cmd_len: sizeof(fake_data.cmdline),
0036 img_adr: KERNELBASE,
0037 fake_residual:
0038 {
0039 ResidualLength: sizeof(RESIDUAL),
0040 Version: 0,
0041 Revision: 0,
0042 EC: 0,
0043 VitalProductData: {
0044 FirmwareSupplier: QEMU,
0045 ProcessorHz: 300000000,
0046 ProcessorBusHz: 100000000,
0047 TimeBaseDivisor:1*1000,
0048 },
0049 MaxNumCpus: 1,
0050 ActualNumCpus: 1,
0051 Cpus: {
0052 {
0053 CpuType: 0x00040103,
0054 CpuNumber: 0,
0055 CpuState: 0,
0056 },
0057 },
0058
0059 TotalMemory: 1024*1024*MEM_MEGS,
0060 GoodMemory: 1024*1024*MEM_MEGS,
0061 ActualNumMemSegs: 13,
0062 Segs: {
0063 { 0x2000, 0xFFF00, 0x00100 },
0064 { 0x0020, MEM_MEGS*0x100, 0x80000 - MEM_MEGS*0x100 },
0065 { 0x0008, 0x00800, 0x00168 },
0066 { 0x0004, 0x00000, 0x00005 },
0067 { 0x0001, 0x006F1, 0x0010F },
0068 { 0x0002, 0x006AD, 0x00044 },
0069 { 0x0010, 0x00005, 0x006A8 },
0070 { 0x0010, 0x00968, MEM_MEGS*0x100 - 0x00968 },
0071 { 0x0800, 0xC0000, 0x3F000 },
0072 { 0x0600, 0xBF800, 0x00800 },
0073 { 0x0500, 0x81000, 0x3E800 },
0074 { 0x0480, 0x80800, 0x00800 },
0075 { 0x0440, 0x80000, 0x00800 }
0076 },
0077 ActualNumMemories: 0,
0078 Memories: {
0079 {0},
0080 },
0081
0082 ActualNumDevices: 1,
0083 Devices: {
0084 {
0085 DeviceId: {
0086 BusId: PROCESSORDEVICE,
0087 BaseType: BridgeController,
0088 SubType: PCIBridge,
0089 Interface: PCIBridgeIndirect,
0090 },
0091 }
0092 },
0093 DevicePnPHeap: {0}
0094 },
0095
0096 cmdline: {
0097 '-','-','n','e','2','k','-','i','r','q','=','9',
0098 0,
0099 }
0100 };
0101
0102
0103 static inline uint8_t
0104 nvram_rd(void)
0105 {
0106 uint8_t rval = *(volatile uint8_t*)0x80000077;
0107 asm volatile("eieio");
0108 return rval;
0109 }
0110
0111
0112 static inline void
0113 nvram_addr(uint16_t addr)
0114 {
0115 *(volatile uint8_t*)0x80000074 = (addr & 0xff);
0116 asm volatile("eieio");
0117 *(volatile uint8_t*)0x80000075 = ((addr>>8) & 0xff);
0118 asm volatile("eieio");
0119 }
0120
0121
0122 static uint32_t
0123 nvram_rdl_be(uint16_t addr)
0124 {
0125 int i;
0126 uint32_t rval = 0;
0127 for ( i=0; i<sizeof(rval); i++ ) {
0128 nvram_addr( addr + i );
0129 rval = (rval<<8) | nvram_rd();
0130 }
0131 return rval;
0132 }
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145 uint32_t
0146 res_copy(void)
0147 {
0148 struct fake_data *p;
0149 uint32_t addr, cmdl, l, imga;
0150 uint32_t mem_sz, pgs;
0151 int i;
0152 int have_nvram;
0153
0154
0155
0156
0157 have_nvram = ( (('Q'<<24) | ('E'<<16) | ('M'<< 8) | ('U'<< 0)) == nvram_rdl_be( 0x0000 ) );
0158
0159 if ( !have_nvram ) {
0160
0161
0162
0163 return (uint32_t)&fake_data;
0164 }
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176 imga = nvram_rdl_be( 0x0038 );
0177 addr = imga + nvram_rdl_be( 0x003c );
0178 addr += 0x1f;
0179 addr &= ~(0x1f);
0180
0181 p = (struct fake_data *)addr;
0182
0183
0184 cmdl = nvram_rdl_be( 0x0040 );
0185 l = nvram_rdl_be( 0x0044 );
0186
0187 if ( l > 0 ) {
0188
0189 if ( l > sizeof( p->cmdline ) - 1 ) {
0190 l = sizeof( p->cmdline ) - 1;
0191 }
0192
0193 if ( p->cmdline < (char*)cmdl ) {
0194 for ( i=0; i<l; i++ ) {
0195 p->cmdline[i] = ((char*)cmdl)[i];
0196 }
0197 } else {
0198 for ( i=l-1; i>=0; i-- ) {
0199 p->cmdline[i] = ((char*)cmdl)[i];
0200 }
0201 }
0202 }
0203 p->cmdline[l] = 0;
0204
0205 for ( i=0; i<sizeof(p->fake_residual); i++ )
0206 ((char*)&p->fake_residual)[i] = ((char*)&fake_data.fake_residual)[i];
0207 p->dat_len = fake_data.dat_len;
0208 p->res_off = fake_data.res_off;
0209 p->cmd_off = fake_data.cmd_off;
0210 p->cmd_len = l+1;
0211 p->img_adr = imga;
0212
0213
0214
0215 mem_sz = nvram_rdl_be( 0x0030 );
0216 pgs = mem_sz >> 12;
0217
0218 p->fake_residual.TotalMemory = mem_sz;
0219 p->fake_residual.GoodMemory = mem_sz;
0220
0221 p->fake_residual.Segs[1].BasePage = pgs;
0222 p->fake_residual.Segs[1].PageCount = 0x80000 - pgs;
0223 p->fake_residual.Segs[7].PageCount = pgs - 0x00968;
0224
0225 return (uint32_t)p;
0226 }