Date: Sun, 4 Mar 2001 16:41:25 -0800 (PST) From: raymond@one.com.au To: freebsd-gnats-submit@freebsd.org Subject: alpha/25535: unaligned access crash on stq Message-ID: <200103050041.f250fP281920@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 25535
>Category: alpha
>Synopsis: unaligned access crash on stq
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-alpha
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun Mar 04 16:50:03 PST 2001
>Closed-Date:
>Last-Modified:
>Originator: Ray Newman
>Release: FreeBSD 4.2-RELEASE alpha
>Organization:
One Management Australia
>Environment:
FreeBSD alpha.local 4.2-RELEASE FreeBSD 4.2-RELEASE #0: Tue Nov 21 09:42:09 GMT 2000 jkh@rawhide.osd.bsdi.com:/usr/src/sys/compile/GENERIC alpha
>Description:
unaligned access crash on stq occurs where address MOD 8 equals 4.
>How-To-Repeat:
// crash.c
//
// Reproduce crash - do the following:
//
// cc -g -o crash crash.c
// ./crash
// lockstart = 0x12001404c
// pid 1804 (crash): unaligned access: va=0x12001404c pc=0x12000096c
// ra=0x120000934 op=stq
//
#include <stdio.h> // always include
#include <stdlib.h> // these two
#include <sys/types.h> // for u_char def
typedef unsigned long long u_int64; // unix unsigned quadword
typedef u_int64 chr_q; // our quadword special
typedef union VAR_U // get at this two ways
{ chr_q var_qu; // variable name (quadword)
u_char var_cu[8]; // variable name (as char[])
} var_u; // variable name union
typedef struct LOCKTAB // internal lock tables
{ struct LOCKTAB *fwd_link; // point at next one
int size; // how many bytes
short job; // int job (-1 = free)
short lock_count; // how many times locked by job
short byte_count; // size of following reference
u_char vol; // vol number
u_char uci; // uci number (255 = local)
var_u name; // var name
u_char key[256]; // and the key
} locktab; // define locktab
typedef struct SYSTAB // system tables
{ void *jobtab; // address of jobtab
int maxjob; // maximum jobs permitted
int sem_id; // GBD semaphore id
int historic; // Enn, tag+off, $NEXT etc
int max_tt; // max TRANTAB used
int start_user; // he's priv too
void *lockstart; // head of lock table
int locksize; // how many bytes
locktab *lockhead; // head of used locks
locktab *lockfree; // head of lock free space
void *vol[1]; // array of vol ptrs
u_int last_blk_used[1]; // actually setup for real jobs
} systab_struct; // end of systab
int main(int argc,char **argv) // main entry point
{ int c = 8192; // for case
struct SYSTAB *systab; // for test
systab = malloc(sizeof(struct SYSTAB) + c);
bzero(systab, sizeof(struct SYSTAB) + c);
systab->lockstart = ((char *) systab->last_blk_used + 4);
printf("lockstart = %p\n", systab->lockstart);
systab->locksize = c; // the size
systab->lockhead = NULL; // no locks currently
systab->lockfree = (locktab *) systab->lockstart; // free space
systab->lockfree->fwd_link = NULL; // only one
systab->lockfree->size = c;
c = 0;
exit (0);
}
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
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?200103050041.f250fP281920>
