/* ** COPYRIGHT (c) 1993 BY ** DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS. ** ALL RIGHTS RESERVED. ** ** THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ** ONLY IN ACCORDANCE OF THE TERMS OF SUCH LICENSE AND WITH THE ** INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ** COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ** OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ** TRANSFERRED. ** ** THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ** AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ** CORPORATION. ** ** DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ** SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. */ #include #include #include #define USER_BUFFER_ITEMS 10 #define GET_BUFFER_SIZE USER_BUFFER_ITEMS*AFR$K_USER_LENGTH #define SAVE_BUFFER_SIZE 128+64 #define fault_pc afr$l_fault_pc_l #define fault_va afr$l_fault_va_l static int usr_buff_len; static char *usr_buff; static int rep_method; void cause_af() { int addr; int *ptr; int arr[2]; addr = (int) &arr[0]; ptr = (int *) ++addr; *ptr = 1; /* cause aligment fault */ } main() { int i; char get_buffer[GET_BUFFER_SIZE]; struct afrdef *data_item; int offset; int status; int return_size; rep_method = AFR$C_BUFFERED; usr_buff_len = SAVE_BUFFER_SIZE; usr_buff = (char *)malloc (usr_buff_len); if(( status = sys$start_align_fault_report(rep_method, usr_buff, usr_buff_len)) != SS$_NORMAL) return(status); for (i=0;i 0) && (return_size > 0)) { /* got some data, print it */ offset = 0; while (offset < return_size) { data_item = (struct afrdef *)(&get_buffer[offset]); printf ("Alignment fault at PC = %8.8X, VA = %8.8X\n", data_item->fault_pc, data_item->fault_va); offset += AFR$K_USER_LENGTH; } } return (status); }