Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
cmucl
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Carl Shapiro
cmucl
Commits
a18df860
Commit
a18df860
authored
25 years ago
by
dtc
Browse files
Options
Downloads
Patches
Plain Diff
Source cleanup.
parent
aefdc91f
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
lisp/FreeBSD-os.c
+71
-84
71 additions, 84 deletions
lisp/FreeBSD-os.c
lisp/Linux-os.c
+90
-113
90 additions, 113 deletions
lisp/Linux-os.c
with
161 additions
and
197 deletions
lisp/FreeBSD-os.c
+
71
−
84
View file @
a18df860
...
...
@@ -12,7 +12,7 @@
* Much hacked by Paul Werkowski
* GENCGC support by Douglas Crosher, 1996, 1997.
*
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.c,v 1.
4
1999/
08
/2
5
1
4:25
:0
6
dtc Exp $
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/FreeBSD-os.c,v 1.
5
1999/
11
/2
9
1
7:04
:0
7
dtc Exp $
*
*/
...
...
@@ -34,39 +34,20 @@
#include
<sys/proc.h>
#include
"validate.h"
vm_size_t
os_vm_page_size
;
#define DPRINTF(t,a) {if(t)fprintf a;}
#define HAVE_SIGVEC
/* defined - now obsolete */
#define HAVE_SIGACTION
/* replacement for SIGVEC */
/* SIGSTKSZ == 40Kb */
#define SIG_STACK_SIZE (SIGSTKSZ/sizeof(double))
/* make sure the stack is 8 byte aligned */
#if defined USE_SIG_STACK
static
double
estack_buf
[
SIG_STACK_SIZE
];
#endif
#define DPRINTF(t,a) {if (t) fprintf a;}
#if defined GENCGC
#include
"gencgc.h"
#endif
void
os_init
()
void
os_init
(
void
)
{
#if defined USE_SIG_STACK
static
struct
sigaltstack
estack
;
estack
.
ss_base
=
(
char
*
)
estack_buf
;
/* this should be ss_sp */
estack
.
ss_size
=
SIGSTKSZ
;
estack
.
ss_flags
=
0
;
if
(
sigaltstack
(
&
estack
,
0
)
<
0
)
perror
(
"sigaltstack"
);
#endif
os_vm_page_size
=
OS_VM_DEFAULT_PAGESIZE
;
os_vm_page_size
=
OS_VM_DEFAULT_PAGESIZE
;
}
int
sc_reg
(
struct
sigcontext
*
c
,
int
offset
)
int
sc_reg
(
struct
sigcontext
*
c
,
int
offset
)
{
switch
(
offset
)
{
...
...
@@ -81,135 +62,141 @@ sc_reg(struct sigcontext *c, int offset)
}
return
0
;
}
void
os_save_context
()
void
os_save_context
(
void
)
{
/* Called from interrupt handlers so C stuff knows things set in Lisp
/*
* Called from interrupt handlers so C stuff knows things set in Lisp.
*/
}
void
os_set_context
()
void
os_set_context
(
void
)
{
}
os_vm_address_t
os_validate
(
os_vm_address_t
addr
,
os_vm_size_t
len
)
os_vm_address_t
os_validate
(
os_vm_address_t
addr
,
os_vm_size_t
len
)
{
int
flags
=
MAP_PRIVATE
|
MAP_ANONYMOUS
;
int
flags
=
MAP_PRIVATE
|
MAP_ANONYMOUS
;
if
(
addr
)
flags
|=
MAP_FIXED
;
else
flags
|=
MAP_VARIABLE
;
if
(
addr
)
flags
|=
MAP_FIXED
;
else
flags
|=
MAP_VARIABLE
;
DPRINTF
(
0
,
(
stderr
,
"os_validate %x %d => "
,
addr
,
len
));
DPRINTF
(
0
,(
stderr
,
"os_validate %x %d => "
,
addr
,
len
));
if
((
addr
=
mmap
(
addr
,
len
,
OS_VM_PROT_ALL
,
flags
,
-
1
,
0
))
==
(
os_vm_address_t
)
-
1
)
addr
=
mmap
(
addr
,
len
,
OS_VM_PROT_ALL
,
flags
,
-
1
,
0
);
if
(
addr
==
(
os_vm_address_t
)
-
1
)
{
perror
(
"mmap"
);
return
NULL
;
}
DPRINTF
(
0
,(
stderr
,
"%x
\n
"
,
addr
));
DPRINTF
(
0
,
(
stderr
,
"%x
\n
"
,
addr
));
return
addr
;
}
void
os_invalidate
(
os_vm_address_t
addr
,
os_vm_size_t
len
)
void
os_invalidate
(
os_vm_address_t
addr
,
os_vm_size_t
len
)
{
DPRINTF
(
0
,(
stderr
,
"os_invalidate %x %d
\n
"
,
addr
,
len
));
if
(
munmap
(
addr
,
len
)
==
-
1
)
{
fprintf
(
stderr
,
"munmap(0x%x,%d)==-1
\n
"
,
addr
,
len
)
;
DPRINTF
(
0
,
(
stderr
,
"os_invalidate %x %d
\n
"
,
addr
,
len
));
if
(
munmap
(
addr
,
len
)
==
-
1
)
perror
(
"munmap"
);
}
}
os_vm_address_t
os_map
(
int
fd
,
int
offset
,
os_vm_address_t
addr
,
os_vm_size_t
len
)
os_vm_address_t
os_map
(
int
fd
,
int
offset
,
os_vm_address_t
addr
,
os_vm_size_t
len
)
{
if
((
addr
=
mmap
(
addr
,
len
,
OS_VM_PROT_ALL
,
MAP_PRIVATE
|
MAP_FILE
|
MAP_FIXED
,
fd
,
(
off_t
)
offset
))
==
(
os_vm_address_t
)
-
1
)
addr
=
mmap
(
addr
,
len
,
OS_VM_PROT_ALL
,
MAP_PRIVATE
|
MAP_FILE
|
MAP_FIXED
,
fd
,
(
off_t
)
offset
);
if
(
addr
==
(
os_vm_address_t
)
-
1
)
perror
(
"mmap"
);
return
addr
;
}
void
os_flush_icache
(
os_vm_address_t
address
,
os_vm_size_t
length
)
void
os_flush_icache
(
os_vm_address_t
address
,
os_vm_size_t
length
)
{
}
void
os_protect
(
os_vm_address_t
address
,
os_vm_size_t
length
,
os_vm_prot_t
prot
)
void
os_protect
(
os_vm_address_t
address
,
os_vm_size_t
length
,
os_vm_prot_t
prot
)
{
if
(
mprotect
(
address
,
length
,
prot
)
==
-
1
)
if
(
mprotect
(
address
,
length
,
prot
)
==
-
1
)
perror
(
"mprotect"
);
}
static
boolean
in_range_p
(
os_vm_address_t
a
,
lispobj
sbeg
,
size_t
slen
)
static
boolean
in_range_p
(
os_vm_address_t
a
,
lispobj
sbeg
,
size_t
slen
)
{
char
*
beg
=
(
char
*
)
sbeg
;
char
*
end
=
(
char
*
)
sbeg
+
slen
;
char
*
adr
=
(
char
*
)
a
;
char
*
beg
=
(
char
*
)
sbeg
;
char
*
end
=
(
char
*
)
sbeg
+
slen
;
char
*
adr
=
(
char
*
)
a
;
return
(
adr
>=
beg
&&
adr
<
end
);
}
boolean
valid_addr
(
os_vm_address_t
addr
)
boolean
valid_addr
(
os_vm_address_t
addr
)
{
int
ret
;
os_vm_address_t
newaddr
;
newaddr
=
os_trunc_to_page
(
addr
);
if
(
in_range_p
(
addr
,
READ_ONLY_SPACE_START
,
READ_ONLY_SPACE_SIZE
)
||
in_range_p
(
addr
,
STATIC_SPACE_START
,
STATIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
DYNAMIC_0_SPACE_START
,
DYNAMIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
DYNAMIC_1_SPACE_START
,
DYNAMIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
CONTROL_STACK_START
,
CONTROL_STACK_SIZE
)
||
in_range_p
(
addr
,
BINDING_STACK_START
,
BINDING_STACK_SIZE
))
newaddr
=
os_trunc_to_page
(
addr
);
if
(
in_range_p
(
addr
,
READ_ONLY_SPACE_START
,
READ_ONLY_SPACE_SIZE
)
||
in_range_p
(
addr
,
STATIC_SPACE_START
,
STATIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
DYNAMIC_0_SPACE_START
,
DYNAMIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
DYNAMIC_1_SPACE_START
,
DYNAMIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
CONTROL_STACK_START
,
CONTROL_STACK_SIZE
)
||
in_range_p
(
addr
,
BINDING_STACK_START
,
BINDING_STACK_SIZE
))
return
TRUE
;
return
FALSE
;
}
static
void
sigbus_handler
(
int
signal
,
int
code
,
struct
sigcontext
*
context
,
void
*
fault_addr
)
static
void
sigbus_handler
(
int
signal
,
int
code
,
struct
sigcontext
*
context
,
void
*
fault_addr
)
{
#if defined GENCGC
int
page_index
=
find_page_index
(
fault_addr
);
#if SIGBUS_VERBOSE
fprintf
(
stderr
,
"Signal %d, fault_addr=%x, page_index=%d:
\n
"
,
signal
,
fault_addr
,
page_index
);
signal
,
fault_addr
,
page_index
);
#endif
/* Check if the fault is within the dynamic space. */
if
(
page_index
!=
-
1
)
{
/* Un-protect the page */
/* The page should have been marked write
_
protected */
/* The page should have been marked write
protected */
if
(
!
PAGE_WRITE_PROTECTED
(
page_index
))
fprintf
(
stderr
,
"*** Sigbus in page not marked as write protected"
);
fprintf
(
stderr
,
"*** Sigbus in page not marked as write protected
\n
"
);
os_protect
(
page_address
(
page_index
),
4096
,
OS_VM_PROT_ALL
);
page_table
[
page_index
].
flags
&=
~
PAGE_WRITE_PROTECTED_MASK
;
page_table
[
page_index
].
flags
|=
PAGE_WRITE_PROTECT_CLEARED_MASK
;
return
;
}
#endif
DPRINTF
(
0
,(
stderr
,
"sigbus:
\n
"
));
DPRINTF
(
0
,
(
stderr
,
"sigbus:
\n
"
));
interrupt_handle_now
(
signal
,
code
,
context
);
}
static
void
sigsegv_handler
(
int
signal
,
int
code
,
struct
sigcontext
*
context
)
static
void
sigsegv_handler
(
int
signal
,
int
code
,
struct
sigcontext
*
context
)
{
DPRINTF
(
0
,(
stderr
,
"os_sigsegv
\n
"
));
DPRINTF
(
0
,
(
stderr
,
"os_sigsegv
\n
"
));
interrupt_handle_now
(
signal
,
code
,
context
);
}
void
os_install_interrupt_handlers
(
void
)
void
os_install_interrupt_handlers
(
void
)
{
interrupt_install_low_level_handler
(
SIGSEGV
,
sigsegv_handler
);
interrupt_install_low_level_handler
(
SIGBUS
,
sigbus_handler
);
interrupt_install_low_level_handler
(
SIGSEGV
,
sigsegv_handler
);
interrupt_install_low_level_handler
(
SIGBUS
,
sigbus_handler
);
}
This diff is collapsed.
Click to expand it.
lisp/Linux-os.c
+
90
−
113
View file @
a18df860
...
...
@@ -15,7 +15,7 @@
* GENCGC support by Douglas Crosher, 1996, 1997.
* Alpha support by Julian Dolby, 1999.
*
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.
8
1999/
08
/2
5
1
4:25
:0
6
dtc Exp $
* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.
9
1999/
11
/2
9
1
7:04
:0
7
dtc Exp $
*
*/
...
...
@@ -46,16 +46,7 @@
#include
"validate.h"
size_t
os_vm_page_size
;
#define DPRINTF(t,a) {if(t)fprintf a;}
#undef HAVE_SIGVEC
/* defined - now obsolete */
#undef HAVE_SIGACTION
/* replacement for SIGVEC */
/* SIGSTKSZ == 40Kb */
#define SIG_STACK_SIZE (SIGSTKSZ/sizeof(double))
/* make sure the stack is 8 byte aligned */
#if defined USE_SIG_STACK
static
double
estack_buf
[
SIG_STACK_SIZE
];
#endif
#define DPRINTF(t,a) {if (t) fprintf a;}
#if defined GENCGC
#include
"gencgc.h"
...
...
@@ -73,45 +64,32 @@ void update_errno (void)
#endif
void
os_init
(
void
)
void
os_init
(
void
)
{
struct
utsname
name
;
uname
(
&
name
);
/*
w
e need this for mmap */
/*
W
e need this for mmap */
if
(
(
name
.
release
[
0
]
)
<
'2'
)
if
(
name
.
release
[
0
]
<
'2'
)
{
printf
(
"Linux version must be later then 2.0.0!
\n
"
);
exit
(
2
);
}
#if defined USE_SIG_STACK
static
struct
sigaltstack
estack
;
estack
.
ss_base
=
(
char
*
)
estack_buf
;
/* this should be ss_sp */
estack
.
ss_size
=
SIGSTKSZ
;
estack
.
ss_flags
=
0
;
if
(
sigaltstack
(
&
estack
,
0
)
<
0
)
perror
(
"sigaltstack"
);
#endif
#if 0
os_vm_page_size=OS_VM_DEFAULT_PAGESIZE;
#else
os_vm_page_size
=
getpagesize
();
#endif
os_vm_page_size
=
getpagesize
();
#ifdef i386
setfpucw
(
0x1372
|
4
|
8
|
16
|
32
);
/*
n
o interrupts */
setfpucw
(
0x1372
|
4
|
8
|
16
|
32
);
/*
N
o interrupts */
#endif
}
#ifdef i386
int
#if (LINUX_VERSION_CODE >= linuxversion(2,1,0)) || (__GNU_LIBRARY__ >= 6)
sc_reg
(
struct
sigcontext
*
c
,
int
offset
)
int
sc_reg
(
struct
sigcontext
*
c
,
int
offset
)
#else
sc_reg
(
struct
sigcontext_struct
*
c
,
int
offset
)
int
sc_reg
(
struct
sigcontext_struct
*
c
,
int
offset
)
#endif
{
switch
(
offset
)
...
...
@@ -129,27 +107,25 @@ sc_reg(struct sigcontext_struct *c, int offset)
}
#endif
void
os_save_context
(
void
)
void
os_save_context
(
void
)
{
/* Called from interrupt handlers so C stuff knows things set in Lisp
/*
* Called from interrupt handlers so C stuff knows things set in Lisp.
*/
}
void
os_set_context
(
void
)
void
os_set_context
(
void
)
{
}
int
do_mmap
(
os_vm_address_t
*
addr
,
os_vm_size_t
len
,
int
flags
)
int
do_mmap
(
os_vm_address_t
*
addr
,
os_vm_size_t
len
,
int
flags
)
{
/*
w
e _must_ have the memory where we want it...*/
os_vm_address_t
old_addr
=
*
addr
;
/*
W
e _must_ have the memory where we want it...
*/
os_vm_address_t
old_addr
=
*
addr
;
*
addr
=
mmap
(
*
addr
,
len
,
OS_VM_PROT_ALL
,
flags
,
-
1
,
0
);
if
((
(
old_addr
!=
NULL
)
&&
(
*
addr
!=
old_addr
)
)
||
(
*
addr
==
(
os_vm_address_t
)
-
1
)
)
*
addr
=
mmap
(
*
addr
,
len
,
OS_VM_PROT_ALL
,
flags
,
-
1
,
0
);
if
((
old_addr
!=
NULL
&&
*
addr
!=
old_addr
)
||
*
addr
==
(
os_vm_address_t
)
-
1
)
{
fprintf
(
stderr
,
"Error in allocating memory, do you have more then 16MB of memory+swap?
\n
"
);
perror
(
"mmap"
);
...
...
@@ -158,97 +134,102 @@ int do_mmap(os_vm_address_t *addr, os_vm_size_t len,
return
0
;
}
os_vm_address_t
os_validate
(
os_vm_address_t
addr
,
os_vm_size_t
len
)
os_vm_address_t
os_validate
(
os_vm_address_t
addr
,
os_vm_size_t
len
)
{
int
flags
=
MAP_PRIVATE
|
MAP_ANONYMOUS
;
int
flags
=
MAP_PRIVATE
|
MAP_ANONYMOUS
;
os_vm_address_t
oa
=
addr
;
os_vm_size_t
olen
=
len
;
if
(
addr
)
flags
|=
MAP_FIXED
;
else
flags
|=
MAP_VARIABLE
;
if
(
addr
)
flags
|=
MAP_FIXED
;
else
flags
|=
MAP_VARIABLE
;
DPRINTF
(
0
,(
stderr
,
"os_validate %x %d => "
,
addr
,
len
));
DPRINTF
(
0
,
(
stderr
,
"os_validate %x %d => "
,
addr
,
len
));
if
(
addr
)
{
do
{
if
(
len
<=
0x1000000
)
{
if
(
do_mmap
(
&
addr
,
len
,
flags
))
if
(
do_mmap
(
&
addr
,
len
,
flags
))
return
NULL
;
len
=
0
;
len
=
0
;
}
else
{
len
=
len
-
0x1000000
;
if
(
do_mmap
(
&
addr
,
0x1000000
,
flags
))
len
=
len
-
0x1000000
;
if
(
do_mmap
(
&
addr
,
0x1000000
,
flags
))
return
NULL
;
addr
+=
0x1000000
;
addr
+=
0x1000000
;
}
}
while
(
len
>
0
);
while
(
len
>
0
);
}
else
{
if
(
do_mmap
(
&
addr
,
len
,
flags
))
if
(
do_mmap
(
&
addr
,
len
,
flags
))
return
NULL
;
return
addr
;
}
DPRINTF
(
0
,(
stderr
,
"%x
\n
"
,
addr
));
DPRINTF
(
0
,
(
stderr
,
"%x
\n
"
,
addr
));
return
oa
;
}
void
os_invalidate
(
os_vm_address_t
addr
,
os_vm_size_t
len
)
void
os_invalidate
(
os_vm_address_t
addr
,
os_vm_size_t
len
)
{
DPRINTF
(
0
,(
stderr
,
"os_invalidate %x %d
\n
"
,
addr
,
len
));
if
(
munmap
(
addr
,
len
)
==
-
1
)
DPRINTF
(
0
,
(
stderr
,
"os_invalidate %x %d
\n
"
,
addr
,
len
));
if
(
munmap
(
addr
,
len
)
==
-
1
)
perror
(
"munmap"
);
}
os_vm_address_t
os_map
(
int
fd
,
int
offset
,
os_vm_address_t
addr
,
os_vm_size_t
len
)
os_vm_address_t
os_map
(
int
fd
,
int
offset
,
os_vm_address_t
addr
,
os_vm_size_t
len
)
{
if
((
addr
=
mmap
(
addr
,
len
,
OS_VM_PROT_ALL
,
MAP_PRIVATE
|
MAP_FILE
|
MAP_FIXED
,
fd
,
(
off_t
)
offset
))
==
(
os_vm_address_t
)
-
1
)
addr
=
mmap
(
addr
,
len
,
OS_VM_PROT_ALL
,
MAP_PRIVATE
|
MAP_FILE
|
MAP_FIXED
,
fd
,
(
off_t
)
offset
);
if
(
addr
==
(
os_vm_address_t
)
-
1
)
perror
(
"mmap"
);
return
addr
;
}
void
os_flush_icache
(
os_vm_address_t
address
,
os_vm_size_t
length
)
void
os_flush_icache
(
os_vm_address_t
address
,
os_vm_size_t
length
)
{
}
void
os_protect
(
os_vm_address_t
address
,
os_vm_size_t
length
,
os_vm_prot_t
prot
)
void
os_protect
(
os_vm_address_t
address
,
os_vm_size_t
length
,
os_vm_prot_t
prot
)
{
if
(
mprotect
(
address
,
length
,
prot
)
==
-
1
)
if
(
mprotect
(
address
,
length
,
prot
)
==
-
1
)
perror
(
"mprotect"
);
}
static
boolean
in_range_p
(
os_vm_address_t
a
,
lispobj
sbeg
,
size_t
slen
)
static
boolean
in_range_p
(
os_vm_address_t
a
,
lispobj
sbeg
,
size_t
slen
)
{
char
*
beg
=
(
char
*
)
sbeg
;
char
*
end
=
(
char
*
)
sbeg
+
slen
;
char
*
adr
=
(
char
*
)
a
;
char
*
beg
=
(
char
*
)
sbeg
;
char
*
end
=
(
char
*
)
sbeg
+
slen
;
char
*
adr
=
(
char
*
)
a
;
return
(
adr
>=
beg
&&
adr
<
end
);
}
boolean
valid_addr
(
os_vm_address_t
addr
)
boolean
valid_addr
(
os_vm_address_t
addr
)
{
int
ret
;
os_vm_address_t
newaddr
;
newaddr
=
os_trunc_to_page
(
addr
);
if
(
in_range_p
(
addr
,
READ_ONLY_SPACE_START
,
READ_ONLY_SPACE_SIZE
)
||
in_range_p
(
addr
,
STATIC_SPACE_START
,
STATIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
DYNAMIC_0_SPACE_START
,
DYNAMIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
DYNAMIC_1_SPACE_START
,
DYNAMIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
CONTROL_STACK_START
,
CONTROL_STACK_SIZE
)
||
in_range_p
(
addr
,
BINDING_STACK_START
,
BINDING_STACK_SIZE
))
newaddr
=
os_trunc_to_page
(
addr
);
if
(
in_range_p
(
addr
,
READ_ONLY_SPACE_START
,
READ_ONLY_SPACE_SIZE
)
||
in_range_p
(
addr
,
STATIC_SPACE_START
,
STATIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
DYNAMIC_0_SPACE_START
,
DYNAMIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
DYNAMIC_1_SPACE_START
,
DYNAMIC_SPACE_SIZE
)
||
in_range_p
(
addr
,
CONTROL_STACK_START
,
CONTROL_STACK_SIZE
)
||
in_range_p
(
addr
,
BINDING_STACK_START
,
BINDING_STACK_SIZE
))
return
TRUE
;
return
FALSE
;
}
...
...
@@ -260,30 +241,28 @@ void sigsegv_handler(HANDLER_ARGS)
{
GET_CONTEXT
int
fault_addr
=
((
struct
sigcontext_struct
*
)(
&
contextstruct
))
->
cr2
;
int
page_index
=
find_page_index
((
void
*
)
fault_addr
);
/*signal(sig,sigsegv_handler); /* Re-install; necessary? */
int
fault_addr
=
((
struct
sigcontext_struct
*
)
(
&
contextstruct
))
->
cr2
;
int
page_index
=
find_page_index
((
void
*
)
fault_addr
);
/* Check if the fault is within the dynamic space. */
if
(
page_index
!=-
1
)
{
if
(
page_index
!=
-
1
)
{
/* Un-protect the page */
/* The page should have been marked write protected */
if
(
!
PAGE_WRITE_PROTECTED
(
page_index
))
fprintf
(
stderr
,
"*** Sigsegv in page not marked as write protected"
);
fprintf
(
stderr
,
"*** Sigsegv in page not marked as write protected
\n
"
);
os_protect
(
page_address
(
page_index
),
4096
,
OS_VM_PROT_ALL
);
page_table
[
page_index
].
flags
&=
~
PAGE_WRITE_PROTECTED_MASK
;
page_table
[
page_index
].
flags
|=
PAGE_WRITE_PROTECT_CLEARED_MASK
;
return
;
}
DPRINTF
(
0
,(
stderr
,
"sigsegv: eip: %p
\n
"
,
context
->
eip
));
interrupt_handle_now
(
signal
,
contextstruct
);
return
;
}
#else
static
void
sigsegv_handler
(
HANDLER_ARGS
)
static
void
sigsegv_handler
(
HANDLER_ARGS
)
{
os_vm_address_t
addr
;
...
...
@@ -291,23 +270,23 @@ sigsegv_handler(HANDLER_ARGS)
GET_CONTEXT
#endif
DPRINTF
(
0
,(
stderr
,
"sigsegv
\n
"
));
DPRINTF
(
0
,
(
stderr
,
"sigsegv
\n
"
));
#ifdef i386
interrupt_handle_now
(
signal
,
contextstruct
);
interrupt_handle_now
(
signal
,
contextstruct
);
#else
#define CONTROL_STACK_TOP (((char*)CONTROL_STACK_START)
+
CONTROL_STACK_SIZE)
#define CONTROL_STACK_TOP (((char*)
CONTROL_STACK_START)
+
CONTROL_STACK_SIZE)
addr
=
arch_get_bad_addr
(
signal
,
code
,
context
);
if
(
addr
!=
NULL
&&
context
->
sc_regs
[
reg_ALLOC
]
&
(
1
<<
63
))
{
context
->
sc_regs
[
reg_ALLOC
]
-=
(
1
<<
63
);
if
(
addr
!=
NULL
&&
context
->
sc_regs
[
reg_ALLOC
]
&
(
1
<<
63
))
{
context
->
sc_regs
[
reg_ALLOC
]
-=
(
1
<<
63
);
interrupt_handle_pending
(
context
);
}
else
if
(
addr
>
CONTROL_STACK_TOP
&&
addr
<
BINDING_STACK_START
)
{
fprintf
(
stderr
,
"Possible stack overflow at 0x%08lX!
\n
"
,
addr
);
/* try to fix control frame pointer */
while
(
!
(
CONTROL_STACK_START
<=
*
current_control_frame_pointer
&&
*
current_control_frame_pointer
<=
CONTROL_STACK_TOP
))
((
char
*
)
current_control_frame_pointer
)
-=
sizeof
(
lispobj
);
while
(
!
(
CONTROL_STACK_START
<=
*
current_control_frame_pointer
&&
*
current_control_frame_pointer
<=
CONTROL_STACK_TOP
))
((
char
*
)
current_control_frame_pointer
)
-=
sizeof
(
lispobj
);
ldb_monitor
();
}
else
if
(
!
interrupt_maybe_gc
(
signal
,
code
,
context
))
interrupt_handle_now
(
signal
,
code
,
context
);
...
...
@@ -315,24 +294,22 @@ sigsegv_handler(HANDLER_ARGS)
}
#endif
static
void
sigbus_handler
(
HANDLER_ARGS
)
static
void
sigbus_handler
(
HANDLER_ARGS
)
{
#ifdef i386
GET_CONTEXT
#endif
DPRINTF
(
1
,(
stderr
,
"sigbus:
\n
"
));
/* there is no sigbus in linux??? */
DPRINTF
(
1
,
(
stderr
,
"sigbus:
\n
"
));
/* there is no sigbus in linux??? */
#ifdef i386
interrupt_handle_now
(
signal
,
contextstruct
);
interrupt_handle_now
(
signal
,
contextstruct
);
#else
interrupt_handle_now
(
signal
,
code
,
context
);
interrupt_handle_now
(
signal
,
code
,
context
);
#endif
}
void
os_install_interrupt_handlers
(
void
)
void
os_install_interrupt_handlers
(
void
)
{
interrupt_install_low_level_handler
(
SIGSEGV
,
sigsegv_handler
);
interrupt_install_low_level_handler
(
SIGBUS
,
sigbus_handler
);
interrupt_install_low_level_handler
(
SIGSEGV
,
sigsegv_handler
);
interrupt_install_low_level_handler
(
SIGBUS
,
sigbus_handler
);
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment