Re: [PATCH 1/5] x86: provide new infrastructure for GDT descriptors

From: Ingo Molnar
Date: Wed Dec 20 2023 - 04:51:34 EST



* Vegard Nossum <vegard.nossum@xxxxxxxxxx> wrote:

> @@ -27,14 +77,14 @@ struct desc_struct {
> .base0 = (u16) (base), \
> .base1 = ((base) >> 16) & 0xFF, \
> .base2 = ((base) >> 24) & 0xFF, \
> - .type = (flags & 0x0f), \
> - .s = (flags >> 4) & 0x01, \
> - .dpl = (flags >> 5) & 0x03, \
> - .p = (flags >> 7) & 0x01, \
> - .avl = (flags >> 12) & 0x01, \
> - .l = (flags >> 13) & 0x01, \
> - .d = (flags >> 14) & 0x01, \
> - .g = (flags >> 15) & 0x01, \
> + .type = ((flags) & 0x0f), \
> + .s = ((flags) >> 4) & 0x01, \
> + .dpl = ((flags) >> 5) & 0x03, \
> + .p = ((flags) >> 7) & 0x01, \
> + .avl = ((flags) >> 12) & 0x01, \
> + .l = ((flags) >> 13) & 0x01, \
> + .d = ((flags) >> 14) & 0x01, \
> + .g = ((flags) >> 15) & 0x01, \

Yeah, so how about writing it like this:

#define GDT_ENTRY_INIT(flags, base, limit) \
{ \
.limit0 = ((limit) >> 0) & 0xFFFF, \
.limit1 = ((limit) >> 16) & 0x000F, \
.base0 = ((base) >> 0) & 0xFFFF, \
.base1 = ((base) >> 16) & 0x00FF, \
.base2 = ((base) >> 24) & 0x00FF, \
.type = ((flags) >> 0) & 0x000F, \
.s = ((flags) >> 4) & 0x0001, \
.dpl = ((flags) >> 5) & 0x0003, \
.p = ((flags) >> 7) & 0x0001, \
.avl = ((flags) >> 12) & 0x0001, \
.l = ((flags) >> 13) & 0x0001, \
.d = ((flags) >> 14) & 0x0001, \
.g = ((flags) >> 15) & 0x0001, \
}

This encodes it all in a very simple format, without C syntactic
variations: bit position and mask.

Thanks,

Ingo