/* $Id$ */ #include #include #include #include /* * Authorship * ---------- * This software was created by * Till Straumann , 2005, * Stanford Linear Accelerator Center, Stanford University. * * Acknowledgement of sponsorship * ------------------------------ * This software was produced by * the Stanford Linear Accelerator Center, Stanford University, * under Contract DE-AC03-76SFO0515 with the Department of Energy. * * Government disclaimer of liability * ---------------------------------- * Neither the United States nor the United States Department of Energy, * nor any of their employees, makes any warranty, express or implied, or * assumes any legal liability or responsibility for the accuracy, * completeness, or usefulness of any data, apparatus, product, or process * disclosed, or represents that its use would not infringe privately owned * rights. * * Stanford disclaimer of liability * -------------------------------- * Stanford University makes no representations or warranties, express or * implied, nor assumes any liability for the use of this software. * * Stanford disclaimer of copyright * -------------------------------- * Stanford University, owner of the copyright, hereby disclaims its * copyright and all other rights in this software. Hence, anyone may * freely use it for any purpose without restriction. * * Maintenance of notices * ---------------------- * In the interest of clarity regarding the origin and status of this * SLAC software, this and all the preceding Stanford University notices * are to remain affixed to any copy or derivative of this software made * or distributed by the recipient and are to be affixed to any copy of * software made or distributed by the recipient that contains a copy or * derivative of this software. * * ------------------ SLAC Software Notices, Set 4 OTT.002a, 2004 FEB 03 */ /* Simple memory probing routine * * - call from MMU-disabled section to avoid having to * set up mappings. * NOTE: this implies WIMG = 0011 * - call AFTER image is at its destination and PRIOR * to setting up the heap or using any memory beyond * __rtems_end, i.e., the probing algorithm may safely * tamper with memory > __rtems_end. * - MUST lock caches since we're gonna hit space with * no memory attached. * * ASSUMPTIONS: * o image occupies addresses between 0..__rtems_end * o memory size is a multiple of 1<>16 ) { default: printk(__FILE__" CPU_lockUnlockCaches(): unknown CPU (PVR = 0x%08x)\n",_read_PPC_PVR()); return -1; case PPC_750: printk("CPU_lockUnlockCaches(): Can't lock L2 on a mpc750, sorry :-(\n"); return -2; /* cannot lock L2 :-( */ case PPC_7455: case PPC_7457: v = _read_L3CR(); x = 1<<(31-9); v = doLock ? v | x : v & ~x; _write_L3CR(v); v = _read_L2CR(); x = 1<<(31-11); v = doLock ? v | x : v & ~x; _write_L2CR(v); break; case PPC_7400: v = _read_L2CR(); x = 1<<(31-21); v = doLock ? v | x : v & ~x; _write_L2CR(v); break; case PPC_603: case PPC_604: case PPC_604e: break; } v = _read_HID0(); x = 1<<(31-19); v = doLock ? v | x : v & ~x; _write_HID0(v); asm volatile("sync":::"memory"); return 0; } uint32_t probeMemoryEnd(void) { register volatile uint32_t *probe; register uint32_t scratch; register uint32_t tag = TAG; register uint32_t flags; probe = (volatile uint32_t *)__ALIGN(__rtems_end); /* Start with some checks. We avoid using any services * such as 'printk' so we can run at a very early stage. * Also, we *try* to avoid to really rely on the memory * being unused by restoring the probed locations and * keeping everything in registers. Hence we could * even probe our own stack :-) */ if ( CPU_lockUnlockCaches(1) ) return 0; _CPU_MSR_GET(flags); SWITCH_MSR( flags & ~(MSR_EE|MSR_DR|MSR_IR) ); for ( ; (uint32_t)probe ; probe += (1<