|
1 | | -/* $NetBSD: machdep.c,v 1.382 2025/03/16 19:27:30 thorpej Exp $ */ |
| 1 | +/* $NetBSD: machdep.c,v 1.383 2025/04/25 00:59:26 riastradh Exp $ */ |
2 | 2 |
|
3 | 3 | /*- |
4 | 4 | * Copyright (c) 1998, 1999, 2000, 2019, 2020 The NetBSD Foundation, Inc. |
|
69 | 69 |
|
70 | 70 | #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ |
71 | 71 |
|
72 | | -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.382 2025/03/16 19:27:30 thorpej Exp $"); |
| 72 | +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.383 2025/04/25 00:59:26 riastradh Exp $"); |
73 | 73 |
|
74 | 74 | #include <sys/param.h> |
75 | 75 | #include <sys/systm.h> |
@@ -1477,21 +1477,24 @@ regdump(struct trapframe *framep) |
1477 | 1477 |
|
1478 | 1478 |
|
1479 | 1479 | void * |
1480 | | -getframe(const struct lwp *l, int sig, int *onstack) |
| 1480 | +getframe(const struct lwp *l, int sig, int *onstack, size_t size, size_t align) |
1481 | 1481 | { |
1482 | | - void *frame; |
| 1482 | + uintptr_t frame; |
| 1483 | + |
| 1484 | + KASSERT((align & (align - 1)) == 0); |
1483 | 1485 |
|
1484 | 1486 | /* Do we need to jump onto the signal stack? */ |
1485 | 1487 | *onstack = |
1486 | 1488 | (l->l_sigstk.ss_flags & (SS_DISABLE | SS_ONSTACK)) == 0 && |
1487 | 1489 | (SIGACTION(l->l_proc, sig).sa_flags & SA_ONSTACK) != 0; |
1488 | 1490 |
|
1489 | 1491 | if (*onstack) |
1490 | | - frame = (void *)((char *)l->l_sigstk.ss_sp + |
1491 | | - l->l_sigstk.ss_size); |
| 1492 | + frame = (uintptr_t)l->l_sigstk.ss_sp + l->l_sigstk.ss_size; |
1492 | 1493 | else |
1493 | | - frame = (void *)(alpha_pal_rdusp()); |
1494 | | - return (frame); |
| 1494 | + frame = (uintptr_t)alpha_pal_rdusp(); |
| 1495 | + frame -= size; |
| 1496 | + frame &= ~(STACK_ALIGNBYTES | (align - 1)); |
| 1497 | + return (void *)frame; |
1495 | 1498 | } |
1496 | 1499 |
|
1497 | 1500 | void |
@@ -1520,11 +1523,10 @@ sendsig_siginfo(const ksiginfo_t *ksi, const sigset_t *mask) |
1520 | 1523 | struct trapframe *tf; |
1521 | 1524 | sig_t catcher = SIGACTION(p, ksi->ksi_signo).sa_handler; |
1522 | 1525 |
|
1523 | | - fp = (struct sigframe_siginfo *)getframe(l,ksi->ksi_signo,&onstack); |
1524 | 1526 | tf = l->l_md.md_tf; |
1525 | 1527 |
|
1526 | 1528 | /* Allocate space for the signal handler context. */ |
1527 | | - fp--; |
| 1529 | + fp = getframe(l, ksi->ksi_signo, &onstack, sizeof(*fp), _Alignof(*fp)); |
1528 | 1530 |
|
1529 | 1531 | #ifdef DEBUG |
1530 | 1532 | if ((sigdebug & SDB_KSTACK) && p->p_pid == sigpid) |
|
0 commit comments