|
7 | 7 |
|
8 | 8 | #include <openssl/sha.h> |
9 | 9 |
|
10 | | -#define DMA_TEST_DEMO |
| 10 | +//#define DMA_TEST_DEMO |
11 | 11 | #define NO2STR(n) case n: return #n |
12 | 12 |
|
13 | 13 | #define PCI_CRYPTO_DEV(obj) OBJECT_CHECK(PCICryptoState, obj, "crypto") |
|
48 | 48 | CryptoDevice_ReadyState, |
49 | 49 | CryptoDevice_ResetState, |
50 | 50 | CryptoDevice_AesCbcState, |
51 | | - CryptoDevice_Sha2State |
| 51 | + CryptoDevice_Sha2State, |
| 52 | + CryptoDevice_DmaTestState |
52 | 53 | }; |
53 | 54 |
|
54 | 55 | enum { |
@@ -90,6 +91,9 @@ typedef struct DmaRequest |
90 | 91 | * Decrypt |
91 | 92 | * devmem 0xfebf1002 b 3 |
92 | 93 | * |
| 94 | + * Dma test command |
| 95 | + * devmem 0xfebf1002 b 5 |
| 96 | + * |
93 | 97 | * Enable interrupt flag to 2 |
94 | 98 | * devmem 0xfebf1003 b 2 |
95 | 99 | */ |
@@ -133,7 +137,8 @@ typedef enum tagCryptoDeviceCommand { |
133 | 137 | CryptoDevice_ResetCommand, |
134 | 138 | CryptoDevice_AesCbcEncryptoCommand, |
135 | 139 | CryptoDevice_AesCbcDecryptoCommand, |
136 | | - CryptoDevice_Sha2Command |
| 140 | + CryptoDevice_Sha2Command, |
| 141 | + CryptoDevice_DmaTestCommand |
137 | 142 | } CryptoDeviceCommand; |
138 | 143 |
|
139 | 144 | typedef enum tagCryptoDeviceMSI |
@@ -455,13 +460,13 @@ static void clear_interrupt(PCICryptoState *dev) |
455 | 460 | } |
456 | 461 | } |
457 | 462 |
|
458 | | -#ifdef DMA_TEST_DEMO |
| 463 | +//#ifdef DMA_TEST_DEMO |
459 | 464 | struct aaaa { |
460 | 465 | int a; |
461 | 466 | char name[10]; |
462 | 467 | }; |
463 | 468 | struct aaaa in; |
464 | | -#endif |
| 469 | +//#endif |
465 | 470 |
|
466 | 471 | static void pci_crypto_memio_write(void *opaque, |
467 | 472 | hwaddr addr, |
@@ -503,6 +508,7 @@ static void pci_crypto_memio_write(void *opaque, |
503 | 508 | case CryptoDevice_AesCbcEncryptoCommand: |
504 | 509 | case CryptoDevice_AesCbcDecryptoCommand: |
505 | 510 | case CryptoDevice_Sha2Command: |
| 511 | + case CryptoDevice_DmaTestCommand: |
506 | 512 | qemu_cond_signal(&dev->thread_cond); |
507 | 513 | break; |
508 | 514 | default: |
@@ -639,6 +645,22 @@ static int DoAesCbc(PCICryptoState *dev, DmaRequest *dma, bool encrypt) |
639 | 645 | return 0; |
640 | 646 | } |
641 | 647 |
|
| 648 | +static int DoDmaTest(PCICryptoState *dev, DmaRequest *dma) |
| 649 | +{ |
| 650 | + /* read data from driver */ |
| 651 | + cpu_physical_memory_read(dma->in.page_addr, &in, sizeof(struct aaaa)); |
| 652 | + printf("a = %d, name = %s\n", in.a, in.name); |
| 653 | + |
| 654 | + /* we do some modify the data and pass to driver */ |
| 655 | + in.a = 119; |
| 656 | + strcpy(in.name, "DmaOut"); |
| 657 | + /* 将dma in的数据修改后写入到dma out物理地址 */ |
| 658 | + cpu_physical_memory_write(dma->out.page_addr, &in, sizeof(struct aaaa)); |
| 659 | + /* 产生中断通知驱动接收数据, 在驱动中断处理函数中接收数据 */ |
| 660 | + |
| 661 | + return 0; |
| 662 | +} |
| 663 | + |
642 | 664 | static int DoSha256(PCICryptoState *dev, DmaRequest *dma) |
643 | 665 | { |
644 | 666 | unsigned char digest[SHA256_DIGEST_LENGTH] = {}; |
@@ -748,6 +770,18 @@ static void *worker_thread(void *pdev) |
748 | 770 | error = DoSha256(dev, &dma); |
749 | 771 | qemu_mutex_lock(&dev->io_mutex); |
750 | 772 | break; |
| 773 | + |
| 774 | + /* |
| 775 | + * enable interrupt first and run dma |
| 776 | + * devmem 0xfebf1003 b 2 |
| 777 | + * devmem 0xfebf1002 b 5 |
| 778 | + */ |
| 779 | + case CryptoDevice_DmaTestCommand: |
| 780 | + dev->io->State = CryptoDevice_DmaTestState; |
| 781 | + qemu_mutex_unlock(&dev->io_mutex); |
| 782 | + error = DoDmaTest(dev, &dma); |
| 783 | + qemu_mutex_lock(&dev->io_mutex); |
| 784 | + break; |
751 | 785 | } |
752 | 786 |
|
753 | 787 | switch (error) |
|
0 commit comments