improve x@ and x! functions, at least x@ reads back what x! wrote, now.

git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@620 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
Stefan Reinauer
2009-11-20 16:37:41 +00:00
parent 6708a79d0f
commit 51fb2e19c3
2 changed files with 14 additions and 10 deletions

View File

@@ -20,6 +20,10 @@ cell /x = constant 64bit?
then
;
: 64>32 ( 64bitsigned -- 32bitsigned )
h# ffffffff and
;
: lxjoin ( quad.lo quad.hi -- o )
d# 32 lshift or
;
@@ -37,12 +41,12 @@ cell /x = constant 64bit?
;
: unaligned-x@ ( addr - o )
dup la+ unaligned-l@ swap unaligned-l@ lxjoin
dup la1+ unaligned-l@ 64>32 swap unaligned-l@ 64>32 lxjoin
;
: unaligned-x! ( oaddr o -- )
2dup d# 32 rshift unaligned-l!
swap la+ swap h# ffffffff and unaligned-l!
: unaligned-x! ( o oaddr -- )
>r dup d# 32 rshift r@ unaligned-l!
h# ffffffff and r> la1+ unaligned-l!
;
: x@ ( oaddr -- o )

View File

@@ -77,11 +77,11 @@
(unaligned_read_word(addr)|(unaligned_read_word((u8 *)addr+2)<<16))
#define unaligned_write_word(addr, value) \
write_byte(addr, value & 0xff); write_byte((u8 *)addr+1, value>>8)
write_byte(addr, (value & 0xff)); write_byte((u8 *)(addr+1), (value>>8))
#define unaligned_write_long(addr, value) \
unaligned_write_word(addr, value & 0xffff); \
unaligned_write_word(addr + 2, value >> 16)
unaligned_write_word(addr, (value & 0xffff)); \
unaligned_write_word((addr + 2), (value >> 16))
#endif
@@ -93,11 +93,11 @@
((unaligned_read_word(addr)<<16)|unaligned_read_word((u8 *)addr+2))
#define unaligned_write_word(addr, value) \
write_byte(addr, value >> 8); write_byte((u8 *)addr+1, value & 0xff)
write_byte(addr, (value >> 8)); write_byte((u8 *)(addr+1), (value & 0xff))
#define unaligned_write_long(addr, value) \
unaligned_write_word(addr, value >> 16); \
unaligned_write_word(addr + 2, value & 0xffff)
unaligned_write_word(addr, (value >> 16)); \
unaligned_write_word((addr + 2), (value & 0xffff))
#endif
/* bit width handling */