arch/s390/kvm/gaccess.c:321:2: error: expected identifier
Subsystems (3)
kernel test robot
build bottree: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-new head: 24e96425873f27730d30dcfc639a3995e312e6f2 commit: cd07d277e6acce78e103478ea19a452bcf31013e [320/331] mm: madvise: make MADV_NOHUGEPAGE a no-op if !THP config: s390-randconfig-r062-20250514 (https://download.01.org/0day-ci/archive/20250514/[email protected]/config) compiler: clang version 21.0.0git (https://github.com/llvm/llvm-project f819f46284f2a79790038e1f6649172789734ae8) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250514/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
>> arch/s390/kvm/gaccess.c:321:2: error: expected identifier
321 | PROT_NONE,
| ^
include/uapi/asm-generic/mman-common.h:16:19: note: expanded from macro 'PROT_NONE'
16 | #define PROT_NONE 0x0 /* page can not be accessed */
| ^
>> arch/s390/kvm/gaccess.c:344:8: error: duplicate case value: '0' and 'PROT_TYPE_LA' both equal '0'
344 | case PROT_TYPE_LA:
| ^
arch/s390/kvm/gaccess.c:337:8: note: previous case defined here
337 | case PROT_NONE:
| ^
include/uapi/asm-generic/mman-common.h:16:19: note: expanded from macro 'PROT_NONE'
16 | #define PROT_NONE 0x0 /* page can not be accessed */
| ^2 errors generated.
vim +321 arch/s390/kvm/gaccess.c
664b4973537068 Alexander Yarygin 2015-03-09 313
d03193de30e6d9 David Hildenbrand 2016-05-31 314 enum prot_type {
d03193de30e6d9 David Hildenbrand 2016-05-31 315 PROT_TYPE_LA = 0,
d03193de30e6d9 David Hildenbrand 2016-05-31 316 PROT_TYPE_KEYC = 1,
d03193de30e6d9 David Hildenbrand 2016-05-31 317 PROT_TYPE_ALC = 2,
d03193de30e6d9 David Hildenbrand 2016-05-31 318 PROT_TYPE_DAT = 3,
6ae1574c2a24ee Christian Borntraeger 2017-06-07 319 PROT_TYPE_IEP = 4,
b3cefd6bf16e72 Janis Schoetterl-Glausch 2022-08-25 320 /* Dummy value for passing an initialized value when code != PGM_PROTECTION */
b3cefd6bf16e72 Janis Schoetterl-Glausch 2022-08-25 @321 PROT_NONE,
d03193de30e6d9 David Hildenbrand 2016-05-31 322 };
d03193de30e6d9 David Hildenbrand 2016-05-31 323
c783631b0bffe6 Janis Schoetterl-Glausch 2022-05-12 324 static int trans_exc_ending(struct kvm_vcpu *vcpu, int code, unsigned long gva, u8 ar,
c783631b0bffe6 Janis Schoetterl-Glausch 2022-05-12 325 enum gacc_mode mode, enum prot_type prot, bool terminate)
d03193de30e6d9 David Hildenbrand 2016-05-31 326 {
d03193de30e6d9 David Hildenbrand 2016-05-31 327 struct kvm_s390_pgm_info *pgm = &vcpu->arch.pgm;
44ae766353af6e Heiko Carstens 2023-10-12 328 union teid *teid;
d03193de30e6d9 David Hildenbrand 2016-05-31 329
d03193de30e6d9 David Hildenbrand 2016-05-31 330 memset(pgm, 0, sizeof(*pgm));
d03193de30e6d9 David Hildenbrand 2016-05-31 331 pgm->code = code;
44ae766353af6e Heiko Carstens 2023-10-12 332 teid = (union teid *)&pgm->trans_exc_code;
d03193de30e6d9 David Hildenbrand 2016-05-31 333
d03193de30e6d9 David Hildenbrand 2016-05-31 334 switch (code) {
c14b88d76624e0 Janosch Frank 2016-07-29 335 case PGM_PROTECTION:
c14b88d76624e0 Janosch Frank 2016-07-29 336 switch (prot) {
b3cefd6bf16e72 Janis Schoetterl-Glausch 2022-08-25 337 case PROT_NONE:
b3cefd6bf16e72 Janis Schoetterl-Glausch 2022-08-25 338 /* We should never get here, acts like termination */
b3cefd6bf16e72 Janis Schoetterl-Glausch 2022-08-25 339 WARN_ON_ONCE(1);
b3cefd6bf16e72 Janis Schoetterl-Glausch 2022-08-25 340 break;
6ae1574c2a24ee Christian Borntraeger 2017-06-07 341 case PROT_TYPE_IEP:
44ae766353af6e Heiko Carstens 2023-10-12 342 teid->b61 = 1;
3b684a420bd8a2 Joe Perches 2020-03-10 343 fallthrough;
a679c547d19ded Christian Borntraeger 2016-12-15 @344 case PROT_TYPE_LA:
44ae766353af6e Heiko Carstens 2023-10-12 345 teid->b56 = 1;
a679c547d19ded Christian Borntraeger 2016-12-15 346 break;
a679c547d19ded Christian Borntraeger 2016-12-15 347 case PROT_TYPE_KEYC:
44ae766353af6e Heiko Carstens 2023-10-12 348 teid->b60 = 1;
a679c547d19ded Christian Borntraeger 2016-12-15 349 break;
c14b88d76624e0 Janosch Frank 2016-07-29 350 case PROT_TYPE_ALC:
44ae766353af6e Heiko Carstens 2023-10-12 351 teid->b60 = 1;
3b684a420bd8a2 Joe Perches 2020-03-10 352 fallthrough;
c14b88d76624e0 Janosch Frank 2016-07-29 353 case PROT_TYPE_DAT:
44ae766353af6e Heiko Carstens 2023-10-12 354 teid->b61 = 1;
c14b88d76624e0 Janosch Frank 2016-07-29 355 break;
c14b88d76624e0 Janosch Frank 2016-07-29 356 }
c783631b0bffe6 Janis Schoetterl-Glausch 2022-05-12 357 if (terminate) {
44ae766353af6e Heiko Carstens 2023-10-12 358 teid->b56 = 0;
44ae766353af6e Heiko Carstens 2023-10-12 359 teid->b60 = 0;
44ae766353af6e Heiko Carstens 2023-10-12 360 teid->b61 = 0;
c783631b0bffe6 Janis Schoetterl-Glausch 2022-05-12 361 }
3b684a420bd8a2 Joe Perches 2020-03-10 362 fallthrough;
d03193de30e6d9 David Hildenbrand 2016-05-31 363 case PGM_ASCE_TYPE:
d03193de30e6d9 David Hildenbrand 2016-05-31 364 case PGM_PAGE_TRANSLATION:
d03193de30e6d9 David Hildenbrand 2016-05-31 365 case PGM_REGION_FIRST_TRANS:
d03193de30e6d9 David Hildenbrand 2016-05-31 366 case PGM_REGION_SECOND_TRANS:
d03193de30e6d9 David Hildenbrand 2016-05-31 367 case PGM_REGION_THIRD_TRANS:
d03193de30e6d9 David Hildenbrand 2016-05-31 368 case PGM_SEGMENT_TRANSLATION:
d03193de30e6d9 David Hildenbrand 2016-05-31 369 /*
d03193de30e6d9 David Hildenbrand 2016-05-31 370 * op_access_id only applies to MOVE_PAGE -> set bit 61
d03193de30e6d9 David Hildenbrand 2016-05-31 371 * exc_access_id has to be set to 0 for some instructions. Both
c14b88d76624e0 Janosch Frank 2016-07-29 372 * cases have to be handled by the caller.
d03193de30e6d9 David Hildenbrand 2016-05-31 373 */
44ae766353af6e Heiko Carstens 2023-10-12 374 teid->addr = gva >> PAGE_SHIFT;
44ae766353af6e Heiko Carstens 2023-10-12 375 teid->fsi = mode == GACC_STORE ? TEID_FSI_STORE : TEID_FSI_FETCH;
44ae766353af6e Heiko Carstens 2023-10-12 376 teid->as = psw_bits(vcpu->arch.sie_block->gpsw).as;
3b684a420bd8a2 Joe Perches 2020-03-10 377 fallthrough;
d03193de30e6d9 David Hildenbrand 2016-05-31 378 case PGM_ALEN_TRANSLATION:
d03193de30e6d9 David Hildenbrand 2016-05-31 379 case PGM_ALE_SEQUENCE:
d03193de30e6d9 David Hildenbrand 2016-05-31 380 case PGM_ASTE_VALIDITY:
d03193de30e6d9 David Hildenbrand 2016-05-31 381 case PGM_ASTE_SEQUENCE:
d03193de30e6d9 David Hildenbrand 2016-05-31 382 case PGM_EXTENDED_AUTHORITY:
c14b88d76624e0 Janosch Frank 2016-07-29 383 /*
c14b88d76624e0 Janosch Frank 2016-07-29 384 * We can always store exc_access_id, as it is
c14b88d76624e0 Janosch Frank 2016-07-29 385 * undefined for non-ar cases. It is undefined for
c14b88d76624e0 Janosch Frank 2016-07-29 386 * most DAT protection exceptions.
c14b88d76624e0 Janosch Frank 2016-07-29 387 */
d03193de30e6d9 David Hildenbrand 2016-05-31 388 pgm->exc_access_id = ar;
d03193de30e6d9 David Hildenbrand 2016-05-31 389 break;
d03193de30e6d9 David Hildenbrand 2016-05-31 390 }
d03193de30e6d9 David Hildenbrand 2016-05-31 391 return code;
d03193de30e6d9 David Hildenbrand 2016-05-31 392 }d03193de30e6d9 David Hildenbrand 2016-05-31 393
:::::: The code at line 321 was first introduced by commit
:::::: b3cefd6bf16e7234ffbd4209f6083060f4e35f59 KVM: s390: Pass initialized arg even if unused
:::::: TO: Janis Schoetterl-Glausch <[email protected]> :::::: CC: Janosch Frank <[email protected]>
Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Hi,
Due to the line:
include/linux/huge_mm.h:509 '#include <uapi/asm/mman.h>'
there is a name collision in arch/s390/kvm/gaccess.c, where 'PROT_NONE' is also defined as value for 'enum prot_type'.
A possible fix for this would be to rename PROT_NONE in the enum to PROT_TYPE_NONE.
The patch causing this problem was created by me based on a suggestion in the review process of another patch that I submitted first:
https://lore.kernel.org/linux-mm/[email protected]/
In case '#include <uapi/asm/mman.h>' causes unexpected trouble, we can also take the patch back... What do you think?
Thanks and regards
Ignacio
Quoted 1 line · kernel test robot
Quoted 1 line
Quoted 1 line
arch/s390/kvm/gaccess.c:344:8: error: duplicate case value: '0' and 'PROT_TYPE_LA' both equal '0'
+cc s390 people, kvm s390 people + lists. sorry for noise but get_maintainers.pl says there's a lot of you :)
Quoted 5 lines · Ignacio Moreno Gonzalez
Hi,
Due to the line:
include/linux/huge_mm.h:509'#include <uapi/asm/mman.h>'
BTW, I didn't notice at the time, but shouldn't this be linux/mman.h? You shouldn't be importing this header this way generally (only other users are arch code).
But at any rate, you will ultimately import the PROT_NONE declaration.
Quoted 2 lines
there is a name collision in
arch/s390/kvm/gaccess.c, where 'PROT_NONE' is also defined as value for 'enumprot_type'.
That is crazy. Been there since 2022 also...!
Quoted 2 lines
A possible fix for this would be to rename
PROT_NONEin the enum toPROT_TYPE_NONE.
Yeah this is the correct fix, IMO, but you will need to get that sorted with the arch maintainers.
I think this suggests we should back out this change for now and try again next cycle given we haven't much time left.
Have cc'd s390/kvm for s390 maintainers for their input however!
Quoted 6 lines
The patch causing this problem was created by me based on a suggestion in the review process of another patch that I submitted first:
https://lore.kernel.org/linux-mm/[email protected]/
In case '#include <
uapi/asm/mman.h>' causes unexpected trouble, we can also take the patch back... What do you think?
I guess we need to back this out for the time being, since we're so near the end of the cycle.
Quoted 8 lines
Thanks and regards
IgnacioQuoted 1 line · kernel test robot
Quoted 1 line
Quoted 1 line
arch/s390/kvm/gaccess.c:344:8: error: duplicate case value: '0' and 'PROT_TYPE_LA' both equal '0'
For convenience, let me include the top of the original report. The full thing is at https://lore.kernel.org/all/[email protected]/
The original patch for this is at
https://lore.kernel.org/all/20250508-madvise-nohugepage-noop-without-thp-v1-1-e7ceffb197f3@kuka.com/
Original report:
tree: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-new head: 24e96425873f27730d30dcfc639a3995e312e6f2 commit: cd07d277e6acce78e103478ea19a452bcf31013e [320/331] mm: madvise: make MADV_NOHUGEPAGE a no-op if !THP config: s390-randconfig-r062-20250514
+(https://download.01.org/0day-ci/archive/20250514/[email protected]/config)
compiler: clang version 21.0.0git (https://github.com/llvm/llvm-project f819f46284f2a79790038e1f6649172789734ae8) reproduce (this is a W=1 build):
+(https://download.01.org/0day-ci/archive/20250514/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All errors (new ones prefixed by >>):
Quoted 1 line
Quoted 1 line
arch/s390/kvm/gaccess.c:321:2: error: expected identifier
321 | PROT_NONE,
| ^
include/uapi/asm-generic/mman-common.h:16:19: note: expanded from macro 'PROT_NONE'
16 | #define PROT_NONE 0x0 /* page can not be accessed */
| ^Quoted 1 line
Quoted 1 line
arch/s390/kvm/gaccess.c:344:8: error: duplicate case value: '0' and 'PROT_TYPE_LA' both equal '0'
344 | case PROT_TYPE_LA:
| ^
arch/s390/kvm/gaccess.c:337:8: note: previous case defined here
337 | case PROT_NONE:
| ^
include/uapi/asm-generic/mman-common.h:16:19: note: expanded from macro 'PROT_NONE'
16 | #define PROT_NONE 0x0 /* page can not be accessed */
| ^Quoted 14 lines · On Wed, 14 May 2025 14:48:44 +0100 Lorenzo Stoakes…
+cc s390 people, kvm s390 people + lists. sorry for noise but get_maintainers.pl says there's a lot of you :)
Quoted 5 lines · Ignacio Moreno Gonzalez
Hi,
Due to the line:
include/linux/huge_mm.h:509'#include <uapi/asm/mman.h>'BTW, I didn't notice at the time, but shouldn't this be
linux/mman.h? You shouldn't be importing this header this way generally (only other users are arch code).
Quoted 9 lines
But at any rate, you will ultimately import the
PROT_NONEdeclaration.Quoted 2 lines
there is a name collision in
arch/s390/kvm/gaccess.c, where 'PROT_NONE' is also defined as value for 'enumprot_type'.That is crazy. Been there since 2022 also...!
Quoted 2 lines
A possible fix for this would be to rename
PROT_NONEin the enum toPROT_TYPE_NONE.
please write a patch to rename PROT_NONE in our enum to PROT_TYPE_DUMMY, I can review it quickly.
if Paolo has no objections, I'm fine with having the patch go through the mm tree
Quoted 67 lines
Yeah this is the correct fix, IMO, but you will need to get that sorted with the arch maintainers.
I think this suggests we should back out this change for now and try again next cycle given we haven't much time left.
Have cc'd s390/kvm for s390 maintainers for their input however!
Quoted 6 lines
The patch causing this problem was created by me based on a suggestion in the review process of another patch that I submitted first:
https://lore.kernel.org/linux-mm/[email protected]/
In case '#include <
uapi/asm/mman.h>' causes unexpected trouble, we can also take the patch back... What do you think?I guess we need to back this out for the time being, since we're so near the end of the cycle.
Quoted 8 lines
Thanks and regards
IgnacioQuoted 1 line · kernel test robot
Quoted 1 line
Quoted 1 line
arch/s390/kvm/gaccess.c:344:8: error: duplicate case value: '0' and 'PROT_TYPE_LA' both equal '0'For convenience, let me include the top of the original report. The full thing is at https://lore.kernel.org/all/[email protected]/
The original patch for this is at
https://lore.kernel.org/all/20250508-madvise-nohugepage-noop-without-thp-v1-1-e7ceffb197f3@kuka.com/Original report:
tree: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-new head: 24e96425873f27730d30dcfc639a3995e312e6f2 commit: cd07d277e6acce78e103478ea19a452bcf31013e [320/331] mm: madvise: make MADV_NOHUGEPAGE a no-op if !THP config: s390-randconfig-r062-20250514+(https://download.01.org/0day-ci/archive/20250514/[email protected]/config)
compiler: clang version 21.0.0git (https://github.com/llvm/llvm-projectf819f46284f2a79790038e1f6649172789734ae8) reproduce (this is a W=1 build):
+(https://download.01.org/0day-ci/archive/20250514/[email protected]/reproduce)If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/All errors (new ones prefixed by >>):
Quoted 1 line
Quoted 1 line
arch/s390/kvm/gaccess.c:321:2: error: expected identifier321 | PROT_NONE, | ^ include/uapi/asm-generic/mman-common.h:16:19: note: expanded from macro 'PROT_NONE' 16 | #define PROT_NONE 0x0 /* page can not be accessed */ | ^Quoted 1 line
Quoted 1 line
arch/s390/kvm/gaccess.c:344:8: error: duplicate case value: '0' and 'PROT_TYPE_LA' both equal '0'344 | case
PROT_TYPE_LA:
| ^
arch/s390/kvm/gaccess.c:337:8: note: previous case defined here
337 | casePROT_NONE:
| ^
include/uapi/asm-generic/mman-common.h:16:19: note: expanded from macro 'PROT_NONE'16 | #define PROT_NONE 0x0 /* page can not be accessed */ | ^
Am 14.05.25 um 16:27 schrieb Claudio Imbrenda:
Quoted 25 lines
Quoted 22 lines · On Wed, 14 May 2025 14:48:44 +0100 Lorenzo Stoakes…
+cc s390 people, kvm s390 people + lists. sorry for noise but get_maintainers.pl says there's a lot of you :)
Quoted 5 lines · Ignacio Moreno Gonzalez
Hi,
Due to the line:
include/linux/huge_mm.h:509'#include <uapi/asm/mman.h>'BTW, I didn't notice at the time, but shouldn't this be
linux/mman.h? You shouldn't be importing this header this way generally (only other users are arch code).But at any rate, you will ultimately import the
PROT_NONEdeclaration.Quoted 2 lines
there is a name collision in
arch/s390/kvm/gaccess.c, where 'PROT_NONE' is also defined as value for 'enumprot_type'.That is crazy. Been there since 2022 also...!
Quoted 1 line
Quoted 7 lines
Quoted 1 line
Quoted 1 line
A possible fix for this would be to rename
PROT_NONEin the enum toPROT_TYPE_NONE.please write a patch to rename
PROT_NONEin our enum toPROT_TYPE_DUMMY, I can review it quickly.if Paolo has no objections, I'm fine with having the patch go through the mm tree
Yes, lets do a quick fix and I can also do
for a s/PROT_NONE/PROT_TYPE_NONE/g
patch.
Quoted 31 lines · On Wed, 14 May 2025 16:39:11 +0200 Christian Borntraeger…
Am 14.05.25 um 16:27 schrieb Claudio Imbrenda:
Quoted 30 lines
Quoted 14 lines · On Wed, 14 May 2025 14:48:44 +0100 Lorenzo Stoakes…
+cc s390 people, kvm s390 people + lists. sorry for noise but get_maintainers.pl says there's a lot of you :)
Quoted 5 lines · Ignacio Moreno Gonzalez
Hi,
Due to the line:
include/linux/huge_mm.h:509'#include <uapi/asm/mman.h>'BTW, I didn't notice at the time, but shouldn't this be
linux/mman.h? You shouldn't be importing this header this way generally (only other users are arch code).Quoted 9 lines
But at any rate, you will ultimately import the
PROT_NONEdeclaration.Quoted 2 lines
there is a name collision in
arch/s390/kvm/gaccess.c, where 'PROT_NONE' is also defined as value for 'enumprot_type'.That is crazy. Been there since 2022 also...!
Quoted 2 lines
A possible fix for this would be to rename
PROT_NONEin the enum toPROT_TYPE_NONE.please write a patch to rename
PROT_NONEin our enum toPROT_TYPE_DUMMY, I can review it quickly.
Quoted 8 lines
Quoted 2 lines
if Paolo has no objections, I'm fine with having the patch go through the mm tree
Yes, lets do a quick fix and I can also do
for a s/PROT_NONE/PROT_TYPE_NONE/g
patch.
I'd rather have PROT_TYPE_DUMMY, since it's a dummy value and not something that indicates "no protection"
Christian Borntraeger
reviewerAm 14.05.25 um 16:48 schrieb Claudio Imbrenda:
Quoted 8 lines
Quoted 8 lines
Quoted 7 lines
Quoted 1 line
Quoted 1 line
A possible fix for this would be to rename
PROT_NONEin the enum toPROT_TYPE_NONE.please write a patch to rename
PROT_NONEin our enum toPROT_TYPE_DUMMY, I can review it quickly.if Paolo has no objections, I'm fine with having the patch go through the mm tree
Quoted 8 lines
Quoted 5 lines
Yes, lets do a quick fix and I can also do
for a s/PROT_NONE/PROT_TYPE_NONE/g
patch.I'd rather have
PROT_TYPE_DUMMY, since it's a dummy value and not something that indicates "no protection"
makes sense.
Quoted 15 lines · Christian Borntraeger
Am 14.05.25 um 16:48 schrieb Claudio Imbrenda:
Quoted 11 lines
Quoted 11 lines
Quoted 7 lines
Quoted 1 line
Quoted 1 line
A possible fix for this would be to rename
PROT_NONEin the enum toPROT_TYPE_NONE.please write a patch to rename
PROT_NONEin our enum toPROT_TYPE_DUMMY, I can review it quickly.if Paolo has no objections, I'm fine with having the patch go through the mm tree
Yes, lets do a quick fix and I can also do
Quoted 7 lines
Quoted 5 lines
Quoted 2 lines
for a s/PROT_NONE/PROT_TYPE_NONE/g
patch.I'd rather have
PROT_TYPE_DUMMY, since it's a dummy value and not something that indicates "no protection"makes sense.
Thanks for the quick response guys, did you want us to write the patch?
We can put something together quickly if so and cc you on it.
Ack on the comment above, of course!
Cheers, Lorenzo
Quoted 19 lines · On Wed, 14 May 2025 17:01:55 +0100 Lorenzo Stoakes…
Quoted 18 lines · Christian Borntraeger
Am 14.05.25 um 16:48 schrieb Claudio Imbrenda:
Quoted 14 lines
Quoted 13 lines
Quoted 7 lines
Quoted 1 line
Quoted 1 line
A possible fix for this would be to rename
PROT_NONEin the enum toPROT_TYPE_NONE.please write a patch to rename
PROT_NONEin our enum toPROT_TYPE_DUMMY, I can review it quickly.if Paolo has no objections, I'm fine with having the patch go through the mm tree
Yes, lets do a quick fix and I can also do
for a s/PROT_NONE/PROT_TYPE_NONE/g
patch.
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
I'd rather have
PROT_TYPE_DUMMY, since it's a dummy value and not something that indicates "no protection"makes sense.
Thanks for the quick response guys, did you want us to write the patch?
yes please
please don't forget to also add the following tags:
Quoted 2 lines
We can put something together quickly if so and cc you on it.
yep
Quoted 4 lines
Ack on the comment above, of course!
Cheers, Lorenzo