- target_t *target;
- long l;
- u32 width;
- u32 endian;
- u32 len;
- u32 addr;
- u32 count;
- u32 v;
- const char *varname;
- u8 buffer[4096];
- int i,n,e,retval;
-
-
- /* argv[1] = name of array to receive the data
- * argv[2] = desired width
- * argv[3] = memory address
- * argv[4] = length in bytes to read
- */
- if( argc != 5 ){
- Jim_WrongNumArgs( interp, 1, argv, "varname width addr nelems" );
- return JIM_ERR;
- }
- varname = Jim_GetString( argv[1], &len );
- /* given "foo" get space for worse case "foo(%d)" .. add 20 */
-
-
- e = Jim_GetLong( interp, argv[2], &l );
- width = l;
- if( e != JIM_OK ){
- return e;
- }
-
- e = Jim_GetLong( interp, argv[3], &l );
- addr = l;
- if( e != JIM_OK ){
- return e;
- }
- e = Jim_GetLong( interp, argv[4], &l );
- len = l;
- if( e != JIM_OK ){
- return e;
- }
- switch(width){
- case 8:
- width = 1;
- break;
- case 16:
- width = 2;
- break;
- case 32:
- width = 4;
- break;
- default:
- Jim_SetResult(interp,
- Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings( interp, Jim_GetResult(interp),
- "Invalid width param, must be 8/16/32", NULL );
- return JIM_ERR;
- }
- if( len == 0 ){
- Jim_SetResult(interp,
- Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings( interp, Jim_GetResult(interp),
- "mem2array: zero width read?", NULL );
- return JIM_ERR;
- }
- if( (addr + (len * width)) < addr ){
- Jim_SetResult(interp,
- Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings( interp, Jim_GetResult(interp),
- "mem2array: addr + len - wraps to zero?", NULL );
- return JIM_ERR;
- }
- /* absurd transfer size? */
- if( len > 65536 ){
- Jim_SetResult(interp,
- Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings( interp, Jim_GetResult(interp),
- "mem2array: absurd > 64K item request", NULL );
- return JIM_ERR;
- }
-
- if( (width == 1) ||
- ((width == 2) && ((addr & 1) == 0)) ||
- ((width == 4) && ((addr & 3) == 0)) ){
- /* all is well */
- } else {
- char buf[100];
- Jim_SetResult(interp,
- Jim_NewEmptyStringObj(interp));
- sprintf( buf,
- "mem2array address: 0x%08x is not aligned for %d byte reads",
- addr, width );
-
- Jim_AppendStrings( interp, Jim_GetResult(interp),
- buf , NULL );
- return JIM_ERR;
- }
-
- target = get_current_target( active_cmd_ctx );
-
- /* Transfer loop */
-
- /* index counter */
- n = 0;
- /* assume ok */
- e = JIM_OK;
- while( len ){
-
- /* Slurp... in buffer size chunks */
-
- count = len; /* in objects.. */
- if( count > (sizeof(buffer)/width)){
- count = (sizeof(buffer)/width);
- }
-
- retval = target->type->read_memory( target,
- addr,
- width,
- count,
- buffer );
-
- if( retval != ERROR_OK ){
- /* BOO !*/
- LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed",
- addr, width, count );
- Jim_SetResult(interp,
- Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings( interp, Jim_GetResult(interp),
- "mem2array: cannot read memory", NULL );
- e = JIM_ERR;
- len = 0;
- } else {
- v = 0; /* shut up gcc */
- for( i = 0 ; i < count ; i++, n++ ){
- switch(width){
- case 4:
- v = target_buffer_get_u32( target, &buffer[i*width] );
- break;
- case 2:
- v = target_buffer_get_u16( target, &buffer[i*width] );
- break;
- case 1:
- v = buffer[i] & 0x0ff;
- break;
- }
- new_int_array_element( interp, varname, n, v );
- }
- len -= count;
- }
- }
- Jim_SetResult(interp,
- Jim_NewEmptyStringObj(interp));
-
- return JIM_OK;