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).
This commit is contained in:
Doug Rabson 2001-10-18 16:20:04 +00:00
parent e3ddd70789
commit ef826b3ca8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=85109
5 changed files with 41 additions and 12 deletions

View File

@ -50,11 +50,10 @@
#include <vm/vm.h>
#include <machine/inst.h>
#include <machine/db_machdep.h>
#include <machine/mutex.h>
#include <machine/inst.h>
#include <ddb/ddb.h>
#include <ddb/db_access.h>
@ -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);

View File

@ -28,6 +28,7 @@
#include <sys/param.h>
#include <sys/proc.h>
#include <machine/inst.h>
#include <machine/db_machdep.h>
#include <ddb/ddb.h>

View File

@ -78,6 +78,7 @@
#include <fs/procfs/procfs.h>
#include <machine/sigframe.h>
#include <machine/efi.h>
#include <machine/inst.h>
#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;
}

View File

@ -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 */

View File

@ -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_ */