Date: Sat, 12 Aug 2000 20:32:58 +1200 From: "MATTHEW JOHN,LUCKIE" <mjl12@waikato.ac.nz> To: "'freebsd-alpha@freebsd.org'" <freebsd-alpha@freebsd.org> Subject: kernel modules/unaligned access fault Message-ID: <45E87454FFC2D211AD9800508B650094BA4E3E@stu-ex1.waikato.ac.nz>
next in thread | raw e-mail | index | archive | help
Hi
I have created a specialised kernel module for an application i writing that
causes an ip packet to be created in kernel-land, timestamped, and then
sent. I developed and tested this on a pentium machine, before trying it on
a spare alpha that i have turned into a freebsd 4.0-release box for mucking
around on.
this module is loaded via kldload and called via syscall
I am running into problems with the timestamping, whereby i am getting an
unaligned access fault panic.
I am making a call to getnanotime, with the results getting copied into a
bit of data in the mbuf that is offset 48 bytes in the packet
Here is the segment of code that is causing the problem:
struct pathrecord
{
struct in_addr ip; /* 4 bytes */
struct timespec ts; /* 8 bytes */
};
in function code:
struct timespec ts;
struct mbuf *m;
struct pathrecord *pr;
u_int32_t *ui;
m = m_gethdr(M_DONTWAIT, MT_HEADER);
m->m_len = 56;
m->m_pkthdr.len = m->m_len;
m->m_pktdr.rcvif = NULL;
[... the ip packet and some other headers are now filled out ...]
/* if i take this 3 line block of code out, i dont get the faults */
m->m_data += 40;
ui = mtod(m, u_int32_t *);
*ui = 0;
m->m_data += 4; /* 44 bytes offset */
pr = mtod(m, struct pathrecord *pr);
pr->ip = 0;
getnanotime(&ts);
ts.ts_sec = htonl(ts.ts_sec);
ts.ts_nsec = htonl(ts.ts_nsec);
pr->ts = ts; /* crashes in this line, 44 bytes offset from m_data */
and here is the fault dumped from the operating system
fatal kernel trap:
trap entry = 0x4 (unaligned access fault)
a0 = 0xfffffe0000617e64
a1 = 0x2d
a2 = 0x1
pc = 0xfffffe0000a5ad6c
ra = 0xfffffe0000a5ad5c
curproc = 0xfffffe0007bb50c0
pid = 197, comm = test
panic: trap
i know this is because i am not working with the alpha cpu how i should be,
but i dont really know what the story is with offsetting on non - 8bit
boundaries. What should I do to correct my bug?
i also know this is not the most efficient use of coding - i should just be
working with data in the mbuf and not copying the timespec structure in, but
i was just wanting to narrow the bug right down.
Any suggestions will be welcome
Thanks
Matthew Luckie
mjl12@waikato.ac.nz
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-alpha" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?45E87454FFC2D211AD9800508B650094BA4E3E>
