All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yonghong Song <yonghong.song@linux.dev>
To: dthaler1968@googlemail.com
Cc: bpf@ietf.org, bpf@vger.kernel.org
Subject: Re: 64-bit immediate instructions clarification
Date: Thu, 25 Jan 2024 21:34:16 -0800	[thread overview]
Message-ID: <dc839efe-2382-440d-bcf6-b9ddc252f35e@linux.dev> (raw)
In-Reply-To: <259a01da4ff4$adfe9c50$09fbd4f0$@gmail.com>


On 1/25/24 5:12 PM, dthaler1968@googlemail.com wrote:
> The spec defines:
>> As discussed below in `64-bit immediate instructions`_, a 64-bit immediate
>> instruction uses a 64-bit immediate value that is constructed as follows.
>> The 64 bits following the basic instruction contain a pseudo instruction
>> using the same format but with opcode, dst_reg, src_reg, and offset all set to zero,
>> and imm containing the high 32 bits of the immediate value.
> [...]
>> imm64 = (next_imm << 32) | imm
> The 64-bit immediate instructions section then says:
>> Instructions with the ``BPF_IMM`` 'mode' modifier use the wide instruction
>> encoding defined in `Instruction encoding`_, and use the 'src' field of the
>> basic instruction to hold an opcode subtype.
> Some instructions then nicely state how to use the full 64 bit immediate value, such as
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x0  dst = imm64                                integer      integer
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x2  dst = map_val(map_by_fd(imm)) + next_imm   map fd       data pointer
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x6  dst = map_val(map_by_idx(imm)) + next_imm  map index    data pointer
> Others don't:
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x1  dst = map_by_fd(imm)                       map fd       map
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x3  dst = var_addr(imm)                        variable id  data pointer
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x4  dst = code_addr(imm)                       integer      code pointer
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x5  dst = map_by_idx(imm)                      map index    map
> How is next_imm used in those four?  Must it be 0?  Or can it be anything and it's ignored?
> Or is it used for something?

The other four must have next_imm to be 0. No use of next_imm in thee four insns kindly implies this.
See uapi bpf.h for details (search BPF_PSEUDO_MAP_FD).

>
> Dave
>

WARNING: multiple messages have this Message-ID (diff)
From: Yonghong Song <yonghong.song@linux.dev>
To: dthaler1968@googlemail.com
Cc: bpf@ietf.org, bpf@vger.kernel.org
Subject: Re: [Bpf] 64-bit immediate instructions clarification
Date: Thu, 25 Jan 2024 21:34:16 -0800	[thread overview]
Message-ID: <dc839efe-2382-440d-bcf6-b9ddc252f35e@linux.dev> (raw)
Message-ID: <20240126053416.OmRQ6I5RiDWRdEIwbpatxKqvIjkNNzOEtQ3g7ig5GlQ@z> (raw)
In-Reply-To: <259a01da4ff4$adfe9c50$09fbd4f0$@gmail.com>


On 1/25/24 5:12 PM, dthaler1968@googlemail.com wrote:
> The spec defines:
>> As discussed below in `64-bit immediate instructions`_, a 64-bit immediate
>> instruction uses a 64-bit immediate value that is constructed as follows.
>> The 64 bits following the basic instruction contain a pseudo instruction
>> using the same format but with opcode, dst_reg, src_reg, and offset all set to zero,
>> and imm containing the high 32 bits of the immediate value.
> [...]
>> imm64 = (next_imm << 32) | imm
> The 64-bit immediate instructions section then says:
>> Instructions with the ``BPF_IMM`` 'mode' modifier use the wide instruction
>> encoding defined in `Instruction encoding`_, and use the 'src' field of the
>> basic instruction to hold an opcode subtype.
> Some instructions then nicely state how to use the full 64 bit immediate value, such as
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x0  dst = imm64                                integer      integer
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x2  dst = map_val(map_by_fd(imm)) + next_imm   map fd       data pointer
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x6  dst = map_val(map_by_idx(imm)) + next_imm  map index    data pointer
> Others don't:
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x1  dst = map_by_fd(imm)                       map fd       map
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x3  dst = var_addr(imm)                        variable id  data pointer
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x4  dst = code_addr(imm)                       integer      code pointer
>> BPF_IMM | BPF_DW | BPF_LD  0x18    0x5  dst = map_by_idx(imm)                      map index    map
> How is next_imm used in those four?  Must it be 0?  Or can it be anything and it's ignored?
> Or is it used for something?

The other four must have next_imm to be 0. No use of next_imm in thee four insns kindly implies this.
See uapi bpf.h for details (search BPF_PSEUDO_MAP_FD).

>
> Dave
>

-- 
Bpf mailing list
Bpf@ietf.org
https://www.ietf.org/mailman/listinfo/bpf

  reply	other threads:[~2024-01-26  5:34 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-16 20:38 [Bpf] Sign extension ISA question dthaler1968=40googlemail.com
2024-01-16 20:55 ` dthaler1968
2024-01-16 20:55   ` [Bpf] " dthaler1968=40googlemail.com
2024-01-16 22:34   ` Yonghong Song
2024-01-16 22:34     ` [Bpf] " Yonghong Song
2024-01-17  1:56     ` dthaler1968
2024-01-17  1:56       ` [Bpf] " dthaler1968=40googlemail.com
2024-01-17  3:48       ` Yonghong Song
2024-01-17  3:48         ` [Bpf] " Yonghong Song
2024-01-24  2:07         ` Jump instructions clarification dthaler1968
2024-01-24  2:07           ` [Bpf] " dthaler1968=40googlemail.com
2024-01-24 19:33           ` Yonghong Song
2024-01-24 19:33             ` [Bpf] " Yonghong Song
2024-01-26  1:12             ` 64-bit immediate " dthaler1968
2024-01-26  1:12               ` [Bpf] " dthaler1968=40googlemail.com
2024-01-26  5:34               ` Yonghong Song [this message]
2024-01-26  5:34                 ` Yonghong Song
2024-01-26 22:27                 ` dthaler1968
2024-01-26 22:27                   ` [Bpf] " dthaler1968=40googlemail.com
2024-01-27  3:41                   ` Yonghong Song
2024-01-27  3:41                     ` [Bpf] " Yonghong Song
2024-01-27  6:56                     ` dthaler1968
2024-01-27  6:56                       ` [Bpf] " dthaler1968=40googlemail.com

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=dc839efe-2382-440d-bcf6-b9ddc252f35e@linux.dev \
    --to=yonghong.song@linux.dev \
    --cc=bpf@ietf.org \
    --cc=bpf@vger.kernel.org \
    --cc=dthaler1968@googlemail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.