comparison lib/lib.c @ 1399:a0c328bc2c14 draft

Little endian and big endian versions of peek (for host.c).
author Rob Landley <rob@landley.net>
date Mon, 21 Jul 2014 19:56:53 -0500
parents 9dbfd5390b92
children d7be3d62a5cb
comparison
equal deleted inserted replaced
1398:7402cae7889f 1399:a0c328bc2c14
370 ts.tv_sec = miliseconds/1000; 370 ts.tv_sec = miliseconds/1000;
371 ts.tv_nsec = (miliseconds%1000)*1000000; 371 ts.tv_nsec = (miliseconds%1000)*1000000;
372 nanosleep(&ts, &ts); 372 nanosleep(&ts, &ts);
373 } 373 }
374 374
375 int64_t peek(void *ptr, int size) 375 // Inefficient, but deals with unaligned access
376 { 376 int64_t peek_le(void *ptr, unsigned size)
377 if (size & 8) { 377 {
378 volatile int64_t *p = (int64_t *)ptr; 378 int64_t ret = 0;
379 return *p; 379 char *c = ptr;
380 } else if (size & 4) { 380 int i;
381 volatile int *p = (int *)ptr; 381
382 return *p; 382 for (i=0; i<size; i++) ret |= ((int64_t)c[i])<<i;
383 } else if (size & 2) { 383
384 volatile short *p = (short *)ptr; 384 return ret;
385 return *p; 385 }
386 } else { 386
387 volatile char *p = (char *)ptr; 387 int64_t peek_be(void *ptr, unsigned size)
388 return *p; 388 {
389 } 389 int64_t ret = 0;
390 char *c = ptr;
391
392 while (size--) ret = (ret<<8)|c[size];
393
394 return ret;
395 }
396
397 int64_t peek(void *ptr, unsigned size)
398 {
399 return IS_BIG_ENDIAN ? peek_be(ptr, size) : peek_le(ptr, size);
390 } 400 }
391 401
392 void poke(void *ptr, uint64_t val, int size) 402 void poke(void *ptr, uint64_t val, int size)
393 { 403 {
394 if (size & 8) { 404 if (size & 8) {