Port-arm archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Removing armfpe (was STACKCHECKS)
(2012/12/05 22:21), Matt Thomas wrote:
>
> On Dec 5, 2012, at 1:36 AM, Masanobu SAITOH wrote:
>
>> Hi.
>>
>> It seems we can't compile kernel with STACKCHECKS.
>>
>> Is the following patch correct?
>>
>> Index: vm_machdep.c
>> ===================================================================
>> RCS file: /cvsroot/src/sys/arch/arm/arm32/vm_machdep.c,v
>> retrieving revision 1.61
>> diff -u -r1.61 vm_machdep.c
>> --- vm_machdep.c 23 Oct 2012 22:50:00 -0000 1.61
>> +++ vm_machdep.c 5 Dec 2012 09:26:43 -0000
>> @@ -210,10 +210,12 @@
>> #ifdef STACKCHECKS
>> /* Report how much stack has been used - debugging */
>> if (l) {
>> + vaddr_t uv;
>> u_char *ptr;
>> int loop;
>>
>> - ptr = (u_char *)pcb + USPACE_SVC_STACK_BOTTOM;
>> + uv = uvm_lwp_getuarea(l);
>> + ptr = (u_char *)(uv + USPACE_SVC_STACK_BOTTOM);
>> for (loop = 0; loop < (USPACE_SVC_STACK_TOP -
>> USPACE_SVC_STACK_BOTTOM)
>> && *ptr == 0xdd; ++loop, ++ptr) ;
>> log(LOG_INFO, "%d bytes of svc stack fill pattern\n", loop);
>>
>>
>> --
>
> Since armfpe hasn't compiled since we switched to lwps in NetBSD
> 5.0, I think we should just remove it.
Do you mean the first five lines in cpu_lwp_free() should be removed? right?
> void
> cpu_lwp_free(struct lwp *l, int proc)
> {
> #ifdef ARMFPE
> /* Abort any active FP operation and deactivate the context */
> arm_fpe_core_abort(FP_CONTEXT(l), NULL, NULL);
> arm_fpe_core_changecontext(0);
> #endif /* ARMFPE */
We can see a lot of #ifdef ARMFPEs. If those will not be used in future,
we should remove all of them.
> The log seems to be noisy
> and probably should only print if a new "stack low" is encountered.
Offcourse I think so, but I had thought that the existence of #ifdef
STACKCHECKS is to show the usage at every exit. If we don't show it,
MI KSTACK_CHECK_MAGIC has more functions than arm's STACKCHECKS, so
we should remove STACKCHECKS function completely if KSTACKC_CHECK_MAGIC
works correctly on arm.
The real reason why I ask this change, I noticed that the filling area
between KSTACK_CHECK_MAGIC and STACKCHECK is different.
KSTACK_CHECK_MAGIC:
fill between KSTACK_LOWEST_ADDR(l) and STACK_LOWEST_ADDR(l)+KSTACK_SIZE
The size on arm is 0x1d66
STACKCHECKS:
fill between USPACE_SVC_STACK_BOTTOM and USPACE_SVC_STACK_TOP
The size is 0x1e70
The USPACE structure on arm is as follows:
> /*
> * The USPACE area contains :
> * 1. the pcb structure for the process
> * 2. the fp context for FP emulation
> * 3. the kernel (svc) stack
> *
> * The layout of the area looks like this
> *
> * | uarea | FP context | kernel stack |
> *
> * The size of the uarea is known.
> * The size of the FP context is variable depending of the FP emulator
> * in use and whether there is hardware FP support. However we can put
> * an upper limit on it.
> * The kernel stack should be at least 4K is size.
> *
> * The stack top addresses are used to set the stack pointers. The stack
> bottom
> * addresses at the addresses monitored by the diagnostic code for stack
> overflows
> *
> */
>
> #define FPCONTEXTSIZE (0x100)
> #define USPACE_SVC_STACK_TOP (USPACE)
> #define USPACE_SVC_STACK_BOTTOM (sizeof(struct pcb) +
> FPCONTEXTSIZE + 10)
And KSTACK_LOWEST_ADDR and KSTACK_SIZE are (usually) defined in sys/proc.h:
> /*
> * Kernel stack parameters.
> *
> * KSTACK_LOWEST_ADDR: return the lowest address of the LWP's kernel stack,
> * excluding red-zone.
> *
> * KSTACK_SIZE: the size kernel stack for a LWP, excluding red-zone.
> *
> * if <machine/proc.h> provides the MD definition, it will be used.
> */
> #ifndef KSTACK_LOWEST_ADDR
> #define KSTACK_LOWEST_ADDR(l) ((void *)ALIGN((struct pcb
> *)((l)->l_addr) + 1))
> #endif
> #ifndef KSTACK_SIZE
> #define KSTACK_SIZE (USPACE - ALIGN(sizeof(struct pcb)))
> #endif
Both KSTACK_LOWEST_ADDR and KSTACK_SIZE are not defined in <machine/proc.h>.
Is this a bug?
--
-----------------------------------------------
SAITOH Masanobu (msaitoh%execsw.org@localhost
msaitoh%netbsd.org@localhost)
Home |
Main Index |
Thread Index |
Old Index