|
2 | 2 | // License, v. 2.0. If a copy of the MPL was not distributed with this |
3 | 3 | // file, You can obtain one at https://mozilla.org/MPL/2.0/. |
4 | 4 |
|
5 | | -use super::names::{encode_name_string, EisaId}; |
| 5 | +use super::names::{encode_name_string, EisaId, UUID_SIZE}; |
6 | 6 | use super::opcodes::*; |
7 | 7 |
|
8 | 8 | pub trait AmlWriter { |
@@ -441,9 +441,86 @@ impl<'a> MethodGuard<'a> { |
441 | 441 | encode_name_string(name, &mut self.builder.buf); |
442 | 442 | } |
443 | 443 |
|
| 444 | + pub fn return_arg(&mut self, n: u8) { |
| 445 | + assert!(n <= 6); |
| 446 | + self.builder.buf.push(RETURN_OP); |
| 447 | + self.builder.buf.push(ARG0_OP + n); |
| 448 | + } |
| 449 | + |
444 | 450 | pub fn raw(&mut self, bytes: &[u8]) { |
445 | 451 | self.builder.raw(bytes); |
446 | 452 | } |
| 453 | + |
| 454 | + pub fn create_dword_field(&mut self, source: u8, offset: u8, name: &str) { |
| 455 | + self.builder.buf.push(CREATE_DWORD_FIELD_OP); |
| 456 | + self.builder.buf.push(source); |
| 457 | + if offset == 0 { |
| 458 | + self.builder.buf.push(ZERO_OP); |
| 459 | + } else { |
| 460 | + self.builder.buf.push(BYTE_PREFIX); |
| 461 | + self.builder.buf.push(offset); |
| 462 | + } |
| 463 | + encode_name_string(name, &mut self.builder.buf); |
| 464 | + } |
| 465 | + |
| 466 | + pub fn if_uuid_equal( |
| 467 | + &mut self, |
| 468 | + uuid: &[u8; 16], |
| 469 | + body: impl FnOnce(&mut Self), |
| 470 | + ) { |
| 471 | + self.builder.buf.push(IF_OP); |
| 472 | + let start = self.builder.buf.len(); |
| 473 | + self.builder.buf.extend_from_slice(&[0; MAX_PKG_LENGTH_BYTES]); |
| 474 | + |
| 475 | + self.builder.buf.push(LEQUAL_OP); |
| 476 | + self.builder.buf.push(ARG0_OP); |
| 477 | + |
| 478 | + self.builder.buf.push(BUFFER_OP); |
| 479 | + let buffer_start = self.builder.buf.len(); |
| 480 | + self.builder.buf.extend_from_slice(&[0; MAX_PKG_LENGTH_BYTES]); |
| 481 | + self.builder.buf.push(BYTE_PREFIX); |
| 482 | + self.builder.buf.push(UUID_SIZE as u8); |
| 483 | + let buffer_content_start = self.builder.buf.len(); |
| 484 | + self.builder.buf.extend_from_slice(uuid); |
| 485 | + finalize_pkg_length( |
| 486 | + &mut self.builder.buf, |
| 487 | + buffer_start, |
| 488 | + buffer_content_start, |
| 489 | + ); |
| 490 | + |
| 491 | + let content_start = self.builder.buf.len(); |
| 492 | + body(self); |
| 493 | + finalize_pkg_length(&mut self.builder.buf, start, content_start); |
| 494 | + } |
| 495 | + |
| 496 | + pub fn else_block(&mut self, body: impl FnOnce(&mut Self)) { |
| 497 | + self.builder.buf.push(ELSE_OP); |
| 498 | + let start = self.builder.buf.len(); |
| 499 | + self.builder.buf.extend_from_slice(&[0; MAX_PKG_LENGTH_BYTES]); |
| 500 | + let content_start = self.builder.buf.len(); |
| 501 | + body(self); |
| 502 | + finalize_pkg_length(&mut self.builder.buf, start, content_start); |
| 503 | + } |
| 504 | + |
| 505 | + pub fn and_to(&mut self, name: &str, mask: u32) { |
| 506 | + self.builder.buf.push(AND_OP); |
| 507 | + encode_name_string(name, &mut self.builder.buf); |
| 508 | + mask.write_aml(&mut self.builder.buf); |
| 509 | + encode_name_string(name, &mut self.builder.buf); |
| 510 | + } |
| 511 | + |
| 512 | + pub fn or_to(&mut self, name: &str, value: u32) { |
| 513 | + self.builder.buf.push(OR_OP); |
| 514 | + encode_name_string(name, &mut self.builder.buf); |
| 515 | + value.write_aml(&mut self.builder.buf); |
| 516 | + encode_name_string(name, &mut self.builder.buf); |
| 517 | + } |
| 518 | + |
| 519 | + pub fn store(&mut self, source: &str, dest: &str) { |
| 520 | + self.builder.buf.push(STORE_OP); |
| 521 | + encode_name_string(source, &mut self.builder.buf); |
| 522 | + encode_name_string(dest, &mut self.builder.buf); |
| 523 | + } |
447 | 524 | } |
448 | 525 |
|
449 | 526 | impl Drop for MethodGuard<'_> { |
|
0 commit comments