summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m68k
diff options
context:
space:
mode:
authorEric Norum <WENorum@lbl.gov>2005-02-12 22:20:28 +0000
committerEric Norum <WENorum@lbl.gov>2005-02-12 22:20:28 +0000
commit8af3643abf10a6afa9f7137ec3cc547da4eb905b (patch)
tree78d99c01d420e2ff9e94927adfc1717c49a5bc31 /c/src/lib/libbsp/m68k
parent2005-02-12 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-8af3643abf10a6afa9f7137ec3cc547da4eb905b.tar.bz2
Add some more system calls.
Improve in-line assembly.
Diffstat (limited to 'c/src/lib/libbsp/m68k')
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c39
2 files changed, 32 insertions, 9 deletions
diff --git a/c/src/lib/libbsp/m68k/uC5282/include/bsp.h b/c/src/lib/libbsp/m68k/uC5282/include/bsp.h
index 1720bea590..9297aad756 100644
--- a/c/src/lib/libbsp/m68k/uC5282/include/bsp.h
+++ b/c/src/lib/libbsp/m68k/uC5282/include/bsp.h
@@ -83,6 +83,8 @@ int bsp_reset(int flags);
int bsp_program(bsp_mnode_t *chain, int flags);
unsigned const char *bsp_gethwaddr(int a);
const char *bsp_getbenv(const char *a);
+int bsp_flash_erase_range(volatile unsigned short *flashptr, int start, int end);
+int bsp_flash_write_range(volatile unsigned short *flashptr, bsp_mnode_t *chain, int offset);
void bsp_cleanup(void);
diff --git a/c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c b/c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c
index a8af52f63a..62ea8c96d1 100644
--- a/c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c
+++ b/c/src/lib/libbsp/m68k/uC5282/startup/bspstart.c
@@ -277,7 +277,7 @@ do { \
return (type)(ret); \
} while (0)
#define syscall_1(type,name,d1type,d1) \
-type bsp_##name(d1type d1) \
+type bsp_##name(d1type d1) \
{ \
long ret; \
register long __d1 __asm__ ("%d1") = (long)d1; \
@@ -285,12 +285,12 @@ type bsp_##name(d1type d1) \
"trap #2\n\t" \
"move.l %%d0,%0" \
: "=g" (ret) \
- : "d" (SysCode_##name), "d" (__d1) \
+ : "i" (SysCode_##name), "d" (__d1) \
: "d0" ); \
syscall_return(type,ret); \
}
#define syscall_2(type,name,d1type,d1,d2type,d2) \
-type bsp_##name(d1type d1, d2type d2) \
+type bsp_##name(d1type d1, d2type d2) \
{ \
long ret; \
register long __d1 __asm__ ("%d1") = (long)d1; \
@@ -299,19 +299,40 @@ type bsp_##name(d1type d1, d2type d2) \
"trap #2\n\t" \
"move.l %%d0,%0" \
: "=g" (ret) \
- : "d" (SysCode_##name), "d" (__d1),\
+ : "i" (SysCode_##name), "d" (__d1),\
"d" (__d2) \
: "d0" ); \
syscall_return(type,ret); \
}
-#define SysCode_reset 0 /* reset */
-#define SysCode_program 5 /* program flash memory */
-#define SysCode_gethwaddr 12 /* get hardware address */
-#define SysCode_getbenv 14 /* get bootloader environment variable */
-#define SysCode_setbenv 15 /* get bootloader environment variable */
+#define syscall_3(type,name,d1type,d1,d2type,d2,d3type,d3) \
+type bsp_##name(d1type d1, d2type d2, d3type d3) \
+{ \
+ long ret; \
+ register long __d1 __asm__ ("%d1") = (long)d1; \
+ register long __d2 __asm__ ("%d2") = (long)d2; \
+ register long __d3 __asm__ ("%d3") = (long)d3; \
+ __asm__ __volatile__ ("move.l %1,%%d0\n\t" \
+ "trap #2\n\t" \
+ "move.l %%d0,%0" \
+ : "=g" (ret) \
+ : "i" (SysCode_##name), "d" (__d1),\
+ "d" (__d2),\
+ "d" (__d3) \
+ : "d0" ); \
+ syscall_return(type,ret); \
+}
+#define SysCode_reset 0 /* reset */
+#define SysCode_program 5 /* program flash memory */
+#define SysCode_gethwaddr 12 /* get hardware address */
+#define SysCode_getbenv 14 /* get bootloader environment variable */
+#define SysCode_setbenv 15 /* get bootloader environment variable */
+#define SysCode_flash_erase_range 19 /* erase a section of flash */
+#define SysCode_flash_write_range 20 /* write a section of flash */
syscall_1(unsigned const char *, gethwaddr, int, a)
syscall_1(const char *, getbenv, const char *, a)
syscall_2(int, program, bsp_mnode_t *, chain, int, flags)
+syscall_3(int, flash_erase_range, volatile unsigned short *, flashptr, int, start, int, end);
+syscall_3(int, flash_write_range, volatile unsigned short *, flashptr, bsp_mnode_t *, chain, int, offset);
/*
* 'Extended BSP' routines