From ef826b3ca885808824c6a5eecabc1f87f595b2f2 Mon Sep 17 00:00:00 2001 From: Doug Rabson Date: Thu, 18 Oct 2001 16:20:04 +0000 Subject: [PATCH] Shift the code which packs and unpacks instruction bundles out of DDB since it is useful for various emulations duties (e.g. unaligned trap handling). --- sys/ia64/ia64/db_interface.c | 11 +++-------- sys/ia64/ia64/db_trace.c | 1 + sys/ia64/ia64/machdep.c | 26 ++++++++++++++++++++++++++ sys/ia64/include/db_machdep.h | 5 +---- sys/ia64/include/inst.h | 10 ++++++++++ 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/sys/ia64/ia64/db_interface.c b/sys/ia64/ia64/db_interface.c index 5e8fd54233bf..8b138f1faaac 100644 --- a/sys/ia64/ia64/db_interface.c +++ b/sys/ia64/ia64/db_interface.c @@ -50,11 +50,10 @@ #include +#include #include #include -#include - #include #include @@ -487,10 +486,7 @@ db_read_bundle(db_addr_t addr, struct ia64_bundle *bp) db_read_bytes(addr, 8, (caddr_t) &low); db_read_bytes(addr+8, 8, (caddr_t) &high); - bp->template = low & 0x1f; - bp->slot[0] = (low >> 5) & ((1L<<41) - 1); - bp->slot[1] = (low >> 46) | ((high & ((1L<<23) - 1)) << 18); - bp->slot[2] = (high >> 23); + ia64_unpack_bundle(low, high, bp); } void @@ -498,8 +494,7 @@ db_write_bundle(db_addr_t addr, struct ia64_bundle *bp) { u_int64_t low, high; - low = bp->template | (bp->slot[0] << 5) | (bp->slot[1] << 46); - high = (bp->slot[1] >> 18) | (bp->slot[2] << 23); + ia64_pack_bundle(&low, &high, bp); db_write_bytes(addr, 8, (caddr_t) &low); db_write_bytes(addr+8, 8, (caddr_t) &high); diff --git a/sys/ia64/ia64/db_trace.c b/sys/ia64/ia64/db_trace.c index cda89386c318..60be9796ae43 100644 --- a/sys/ia64/ia64/db_trace.c +++ b/sys/ia64/ia64/db_trace.c @@ -28,6 +28,7 @@ #include #include +#include #include #include diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c index 2cd15c1edaa0..e2375edd9375 100644 --- a/sys/ia64/ia64/machdep.c +++ b/sys/ia64/ia64/machdep.c @@ -78,6 +78,7 @@ #include #include #include +#include #ifdef SKI extern void ia64_ski_init(void); @@ -1470,3 +1471,28 @@ globaldata_init(struct globaldata *globaldata, int cpuid, size_t sz) globaldata->gd_cpuid = cpuid; globaldata_register(globaldata); } + +/* + * Utility functions for manipulating instruction bundles. + */ +void +ia64_unpack_bundle(u_int64_t low, u_int64_t high, struct ia64_bundle *bp) +{ + bp->template = low & 0x1f; + bp->slot[0] = (low >> 5) & ((1L<<41) - 1); + bp->slot[1] = (low >> 46) | ((high & ((1L<<23) - 1)) << 18); + bp->slot[2] = (high >> 23); +} + +void +ia64_pack_bundle(u_int64_t *lowp, u_int64_t *highp, + const struct ia64_bundle *bp) +{ + u_int64_t low, high; + + low = bp->template | (bp->slot[0] << 5) | (bp->slot[1] << 46); + high = (bp->slot[1] >> 18) | (bp->slot[2] << 23); + *lowp = low; + *highp = high; +} + diff --git a/sys/ia64/include/db_machdep.h b/sys/ia64/include/db_machdep.h index c4190928769e..caa0c40b9f9a 100644 --- a/sys/ia64/include/db_machdep.h +++ b/sys/ia64/include/db_machdep.h @@ -41,10 +41,7 @@ #define DB_NO_AOUT -struct ia64_bundle { - u_int64_t slot[3]; - int template; -}; +struct ia64_bundle; typedef vm_offset_t db_addr_t; /* address - unsigned */ typedef long db_expr_t; /* expression - signed */ diff --git a/sys/ia64/include/inst.h b/sys/ia64/include/inst.h index 5abea43e853b..60ab22f71193 100644 --- a/sys/ia64/include/inst.h +++ b/sys/ia64/include/inst.h @@ -1165,4 +1165,14 @@ union ia64_instruction { u_int64_t ins; }; +struct ia64_bundle { + u_int64_t slot[3]; + int template; +}; + +extern void ia64_unpack_bundle(u_int64_t low, u_int64_t high, + struct ia64_bundle *bp); +extern void ia64_pack_bundle(u_int64_t *lowp, u_int64_t *highp, + const struct ia64_bundle *bp); + #endif /* _MACHINE_INST_H_ */